내일배움캠프 5일차

2023년 03월 17일 by barryjung

    내일배움캠프 5일차 목차

[오늘 한일]

  • 팀 결과물 검토.
  • 프로젝트 발표회 참여.
  • 개발일지 작성법 강의수강.

 

[오늘 배운점]

팀 결과물을 돌아보면서,

프로젝트 진행중에는 자세히 못 봤던 프론트엔드 쪽 새로 알게된 것들을 체크했다.

 

<a태그 하이퍼링크를 새창으로 띄우기>

<a class='blog' href="url" target="_blank"></a>

a태그와 하이퍼링크 속성을 사용하는게 링크 작성방법 중에는 가장 기본적이라고 생각한다.

여기에 target="_blank"를 넣어서 간단하게 새창으로 뜨게할수 있다.

기본적인 형태이니 활용도가 높을것 같다.

 

a태그를 사용하면 태그 안 문구에 밑줄이 그어진다.

이 부분은 css에서 간단하게 해결할수 있다.

text-decoration-line: none;

이렇게 스타일을 줘서 밑줄을 없애면 된다.

(a태그는 밑줄이 디폴트다라는 느낌이다.)

 


<form태그를 이용한 검색페이지 만들기>

form태그 자체가 검색한 내용과 함께 페이지를 띄우는 역할을 한다.

팀 결과물 리뷰페이지 쪽에서 쓰였다.

<form action="https://search.kyobobook.co.kr/search?keyword=" method="GET" target="_blank">
        <input placeholder="독서록 쓰고 싶은 책을 검색해 주세요." name="keyword" type="text">
        <button>검색</button>
    </form>

같은 방법으로 target="_blank"로 새창에서 띄우게 설정한거 같다.

method=GET이 중요한 부분같은데, 기능으로나 작성법으로나 아직은 잘 모르겠다.

알게되는 대로 정리해봐야겠다.

 


<커서 포인터로 기능 식별하기>

버튼이 버튼 모양이 아니라면 (그냥 텍스트 뿐인 버튼이라면)

버튼에 기능이 들어있는 지 식별하기 어렵다.

 

커서포인터를 이용한다면,

커서를 올렸을때 손모양으로 바뀌는 동작만으로 기능의 유무 표시가 용이하다.

전체 페이지에 다 달려있는 사이드 메뉴바. 아래있는 두 문구는 텍스트로 된 버튼이다.

 

<a>태그와 <button>태그에는 기본적으로 커서포인터가 포함되있는거 같다. (역시나 디폴트라는 느낌이다.)

하지만 <div>태그나 <h2>태그에는 css로 추가 해줘야한다.

 

<div style="cursor: pointer;" class="logo"></div>

css 부분(스타일 태그 안쪽)에 작성하지 않고 태그 안에 이렇게 작성해주셨다.

몇몇개 적은 수의 태그에만 스타일을 줄때는 이런 방법이 있다는 걸 배웠다.

 


<웹스크래핑 none출력 문제 분석>

엊그저께 웹스크래핑에서 난제가 있었는데,

해결방법은 찾아 해결했었지만 혹시몰라 문제원인을 자세히 분석해봤다.

img_tag1 = soup.select_one("#contents > div.prod_detail_header > div > div.prod_detail_view_wrap > div.prod_detail_view_area > div.col_prod_info.thumb > div.prod_thumb_swiper_wrap.active.hover > div.swiper-container.prod_thumb_list_wrap.swiper-container-fade.swiper-container-horizontal > ul > li.prod_thumb_item.swiper-slide.swiper-slide-visible.swiper-slide-active > div > div.portrait_img_box.portrait > img")
img_tag2 = soup.select_one("div.portrait_img_box > img")
img_tag3 = soup.select_one("img[src^='https://contents.kyobobook.co.kr/sih/fit-in/']")
print('case1:',img_tag1)
print('case2:',img_tag2)
print('case3:',img_tag3)

 

강의 때 배운 대로 chrome개발자 도구의 copy selector기능을 이용하면,

img_tag1에 담긴 것처럼 긴 선택자를 만든다.

이 긴 선택자에서 하나라도 잘못된 부분이 있으면 태그를 못 찾는 것이다. (즉, none이 출력된다.)

 

그래서 해당하는 태그를 찾을 수 있게 선택자를 만들어줘야 한다.

한참을 이렇게도 넣어보고 저렇게도 넣어봤다.

선택자 맨뒤부터 한단씩 잘라서 어디부터 못 불러오는지 추적했다.

그러자 col_prod_info.thumb부분부터는 불러와졌다.

그 태그를 기준으로 하위 태그를 전부 못 불러왔다.

 

해당 태그도 그렇고 바로 하위 태그도 그렇고, 클래스 값을 두개가지고 있다는게 특이했다.

혹시 싶어서 클래스 두개중 하나씩만 선택자에 넣어보았다.

맨 윗줄과 두번째줄, 그리고 최하위 div태그도 클래스가 두개이다. 선택된 img태그가 타겟.

 

클래스를 하나만 넣으니까 태그를 잘 불러온다!

img_tag2가 그 부분이다. 최하위 div태그에서 portrait를 제외하고 portrait_img_box만 찾게 바꿨다.

그런데 또 특이한건 거꾸로 portrait_img_box를 제외하고 portrait으로 찾게하면 못찾는다.

즉 portrait가 범인이라는 말이 된다.

(두번째줄 태그 클래스중에 active도 범인이다.)

 

해결방법은 문제가 있는 속성 값은 포함되지 않게 하고.

(클래스든, id든, 다른 속성이든)

잘 불러와지는 속성 값을 찾아 원하는 태그를 찾을수 있는 선택자를 작성해야 한다는 것이다.

 

이 분석 내용은 결국 교보문고 url에 한정한 분석이니까,

다른 사이트를 스크래핑 할때는 또 다른 문제가 발생할 것이다.

그때도 이런 접근으로 가장 적절한 선택자를 만들어 낼수 있을 거다.

 

결론, 선택자를 골라내는 노하우가 중요하다!

※ 발표 때도 튜터님께서 피드백을 주신 내용인데,

스크래핑 같은 기능은 새로운 사이트에 하려고 할때마다 새로운 문제점에 부딫힐거라고 하셨다.