강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Honolulu님의 프로필 이미지
Honolulu

작성한 질문수

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

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

선생님, 질문 드립니다.

작성

·

252

1

선생님, 안녕하세요.

아래 질문에서 아이디어를 얻어 다음에서 날씨를 프린트하는 코드를 어찌어찌 짜보았습니다.

마지막 결과에서 각 지역별 기온을 쭉 프린트하고 싶은데, 어떻게 해야할지 막막해서 질문 드립니다. 

for문을 써서 title이나 cel만큼 반복하게 하면 될까요?

답변 1

1

남박사님의 프로필 이미지
남박사
지식공유자

일단 파싱을 하고자 하는 데이터가 하나의 셋트 개념이라면 (여기서는 온도와 지역) 위처럼 따로 cel, title 을 구하게 되면 질문하신것 처럼 각각의 데이터에 접근을 해야하는 문제가 발생합니다. li.hide 를 불필요하게 2번 구할 필요도 없습니다. ^^

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.daum.net")
bs = BeautifulSoup(r.text, "html.parser")

lists = bs.select("li.hide")
temperature = bs.select("li.hide")

cel_list = []
title_list = []

for temp in temperature:
	cel_list.append(temp.find("span", {"class": "txt_temper"}).text)

for li in lists:
	title_list.append(li.find("span", {"class": "txt_part"}).text)

if len(cel_list) == len(title_list):
	for i, j in zip(cel_list, title_list):
		print(i, j)

일단 위의 코드가 질문하신 내용에 충실한 답변입니다. cel 과 title 변수대신 cel_list, title_list 라는 리스트형 변수에 값을 모두 추가해서 해당 리스트만큼 반복문으로 도는 내용입니다. zip() 함수는 2개의 리스트를 한개로 압축하여 동일하게 반복시킬 수 있는 기능이 있습니다. 

그러나 위의 방식보다는 li.hide 를 한번만 접근해서 반복문을 1회만 사용해서 구하는게 더 좋아 보입니다. (물론 크롤링에 정답은 없습니다.)

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.daum.net")
bs = BeautifulSoup(r.text, "html.parser")

lists = bs.select("ul.list_weather > li.hide")

for data in lists:
	title = data.select_one("span.txt_part").text
	cel = data.select_one("span.txt_temper").text
	print(title, cel)

위의 코드도 한번 확인해보시기 바랍니다. ^^

Honolulu님의 프로필 이미지
Honolulu

작성한 질문수

질문하기