아하
생활
차분한파카255
차분한파카255
20.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개의 답변이 있어요!
  • 소탈한라마28
    소탈한라마28
    20.09.08

    안녕하세요,

    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=',')