• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

선생님, 질문 드립니다.

20.05.22 14:00 작성 조회수 175

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)

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