inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

남박사의 파이썬 기초부터 실전 100% 활용

[삭제예정] 네이버 실시간 검색어 크롤링 하기

크롤링 html 구조? 질문 있습니다.

843

유승우

작성한 질문수 2

1

크롤링 강의를 듣고나서 연습겸 식단의 중식메뉴를 크롤링 해보려는 시도를 하고 있습니다.
네이버 실시간검색어 크롤링하는거에서 조금만 고쳐서 가져오려고 하니 내용을 제대로 못가져오는데 그 이유를  알수 없어 질문 남깁니다.
차이점이라곤 #text 붙어 있다는 것인데 이것의 의미하는 것이 무엇인지 궁금하고 이 부분을 출력하려면 어떻게 해야되는지 궁금합니다.

웹-크롤링 python

답변 1

1

남박사

#text는 요소에 id 값이 text 인 요소를 말하는건데 이런 id 값은 웹을 만든 개발자가 부여한 값이므로 있을수도 있고 없을수도 있습니다. # 이 붙은 값은 id 값이고 . 붙은 값은 class 값입니다.

보여주신 스샷을 살펴보니 테이블 구조로 되어있는걸로 보입니다.

테이블 구조는 td요소에 id값이 없는경우 위에서 부터 순차적으로 접근하는 방법 밖에 없습니다.

그리고 find 함수보다 select 함수를 사용하는걸 더 권장합니다.

tables = bs.select_one("table.menuTb") # 테이블에 클래스명이 menuTb 인 요소 1개만 선택

# 테이블 요소 선택에 문제가 없었다면..

if tables:

     tds = tables.select("tbody > tr > td")  # menuTb클래스의 테이블 요소에서 tbody 밑에 tr 밑에 td 를 모두 선택

     # 선택된 td 요소를 모두 출력

     for td in tds: 

            print(td)

아니면 td의 갯수가 고정되었다면 

tds = tables.select("tbody > tr > td")  # menuTb클래스의 테이블 요소에서 tbody 밑에 tr 밑에 td 를 모두 선택

# 선택된 tds 의 갯수가 3개일때만(조식, 중식, 석식)

if len(tds) == 3:

    menu1 = tds[0].text 

    menu2 = tds[1].text

    menu3 = tds[2].text

이런식으로 작성해도 됩니다. 그런데 스샷의 주소를 들어가서 보니 해당 페이지가 인코딩이 명시되지 않아서인지 한글이 깨지더라구요 그런경우에는 뷰티플숩에 r.text를 넘기지 말고 r.content 를 넘겨서 해결할 수 있습니다. r.text는 인코딩이 된텍스트를 넘기는거고 r.content 는 인코딩 되기 전의 바이너리 데이터를 넘깁니다.

import requests
from bs4 import BeautifulSoup

url = "https://www.kaist.ac.kr/_prog/fodlst/index.php?site_dvs_cd=kr&menu_dvs_cd=050303&dvs_cd=emp&stt_dt=2019-11-15"
r = requests.get(url)

# r.text 는 한글이 깨지므로 r.content 로 인코딩 되지 않은 원본 바이너리 데이터를 넘깁니다. 
# r.text 는 인코딩이 된 데이터입니다.
bs = BeautifulSoup(r.content, "html.parser")

# 이전 코드 스타일
# lists = bs.find_all("table", {"class": "menuTb"})
# print(lists)
# for table in lists:
#    title = table.find("td")
#    print(title)

# 새로운 코드 스타일
# select_one 으로 table 의 클래스명이 menuTb 인 요소 1개만 선택(대상이 여러개인경우 맨위에 것만 선택됩니다.)
table = bs.select_one("table.menuTb")

# 테이블이 존재한다면(오류방지)
if table:
    # 해당 테이블에서 tbody 밑에 tr 밑에 td 요소 모두를 선택
    # 테이블의 td는 이렇게 tbody 부터 접근해서 내려가야만 select 되는 경우가 많습니다.
    tds = table.select("tbody > tr > td")

    # tds의 갯수가 3개인경우만동작 (조식, 중식, 석식)
    if len(tds) == 3:
        menu1 = tds[0].text
        menu2 = tds[1].text
        menu3 = tds[2].text
        print(menu1, menu2, menu3)

38강 = 연산자 더하고 빼기

0

60

2

주석처리

0

117

1

함수의 파라미터값 msg

0

155

1

강의자료 이미지 안나옴

0

239

3

강의자료 질문 두번째

0

165

3

강의자료 관련 질문

0

116

1

파이썬 예외 처리 try / except 파일 처리 코드가 실행이 안됩니다.

0

235

1

소수 너무 어려워요

0

245

1

imagefont 함수 사용

0

239

1

pylint

0

357

1

add 함수 문의 ㅠㅠ

0

283

1

형식 문의드립니다.

0

210

1

변수 명을 왜 src, tar로 하셨는지 궁금합니다.

0

602

1

숫자야구 코드를 짜 봤는데 뭔가 이상합니다.

0

253

1

zsh: command not found: pylint

0

269

1

텔레그램 봇 만들기 코드 실행이 안됩니다 박사님..ㅠ

0

546

1

질문드립니다.

1

374

2

list.reverse() 출력에 대해서 질문있습니다.

1

433

1

데코레이터 함수 및 동작시간 질문입니다.~

1

323

2

opencv 사용하면서 궁금한점 (해상도)

1

781

1

질문드립니다.

1

299

1

아래 오류가 뜨면서 vscode가 컴파일이 되지 않는데.. 혹시 왜이럴까요?

1

445

1

크롤링안되는 현상 문의 드립니다.

1

422

1

파이썬 크롤링 관련 문의

1

278

1