아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
차분한파카255
차분한파카25520.09.07

파이썬 크롤링에서의 for 관련 질문드립니다.

import urllib.request

import urllib.parse

from bs4 import BeautifulSoup

import os

import requests

from selenium import webdriver

import csv


driver = webdriver.Chrome('C:/rrr/chromedriver.exe')baseurl = 'https://www.sbs.co.kr/schedule/index.html?type=dmb&channel=DMB+TV&pmDate='plusurl = input("날짜입력(ex:20200815):")url = baseurl + urllib.parse.quote_plus(plusurl) driver.get(url)
html = driver.page_sourcesoup = BeautifulSoup(html)
#--------------select일경우------------------

try:

for i in range(50):

time1 = soup.select('.spthours')[i].text

time2 = soup.select('.spthours')[i+1].text

title1 = soup.select('.spititle')[i].text

print(time1, time2, title1, '-1,-1', sep=',')

i = i + 1

except:

title1 = soup.select('.spititle')[i].text

print(time2, title1, '-1,-1', sep=',')

--------------------------------------------------------------------------------------------------

이전에 이어서 질문드립니다.

답변달아주신 분들 덕분에 +3지식과 문제가 해결되에 뒤에 주르륵 만들어보았습니다.

위의 코드를 돌려서 바로 csv파일을 만들 계획이긴 한데,

요지는 for i in range(50): 부분입니다.

크롤링할때 매일 시간,편성부분이 매번 달라지는데, 'in soup : '로 썼다간 에러가 뜨더군요...ㅠ

그래서 넉넉하게 범위 50으로 적긴했는데, in 뒤에 적절하게 들어갈만한 변수가 있을까요??

55글자 더 채워주세요.
답변의 개수
3개의 답변이 있어요!
  • 안녕하세요,

    soup.select('.spthours')의 개수를 이용하시는게 좋아 보입니다.

    spthours = soup.select('.spthours') for idx in range(len(spthours) - 1): time1 = spthours[idx].text time2 = spthours[idx+1].text

    위와 같은 방식으로 코드를 짜시면 될 것 같습니다.

    감사합니다.


  • 개발 컴퓨터가 아니다보니 개발 환경이 안되어 있어 정확하게는 못돌려보았지만 range(50) 인 코드는 좋아보이지 않습니다.

    아래와 같이 변경하는게 어떻까 합니다.

    우선 코드를 못돌려보다보니 정확하지는 않을 수 있습니다.

    select자체가 1개가 있어도 배열을 리턴하게 되어 있습니다.

    배열은 length라는 길이를 가진 값이 있으니 길이 만큼 for문을 돌리는것이 좋아보입니다.

    hours_tags = soup.select('.spthours') for i in hours_tags.length: time1 = hours_tags[i].text

    SBS방송쪽 클로링 하는 질문을 봤던것 같습니다.

    json이 날라오는데 이렇게 크롤링 해야할 이유가 있을까 합니다.

    url = "https://static.cloud.sbs.co.kr/schedule/2020/9/8/DMB+TV.json?_=1599496474274" jsonData = requests.get(url).json() for program in jsonData.length: start_time = program.start_time title = program.title

    이런식으로 하는게 코드가 더 깔끔해보이기는 합니다.


  • 간단히 작성해서 올려드립니다.

    import urllib.parse from bs4 import BeautifulSoup import os import requests from selenium import webdriver driver = webdriver.Chrome() baseurl = 'https://www.sbs.co.kr/schedule/index.html?type=dmb&channel=DMB+TV&pmDate=' plusurl = input("날짜입력(ex:20200815):") url = baseurl + urllib.parse.quote_plus(plusurl) driver.get(url) html = driver.page_source soup = BeautifulSoup(html) for i in range(len(soup.findAll('strong', attrs={'class': 'spt_hours'}))): #spt_hours를 개수를 찾으시면 됩니다. time1 = soup.select('.spt_hours')[i].text #spthours가 아니라 spt_hours로 해주셔야 됩니다. time2 = soup.select('.spt_hours')[i+1].text # title1 = soup.select('.spi_title')[i].text # print(time1, time2, title1, '-1,-1', sep=',')