인프런 커뮤니티 질문&답변
선생님, 질문 드립니다.
작성
·
252
답변 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)
위의 코드도 한번 확인해보시기 바랍니다. ^^





