작성
·
1.8K
0
안녕하세요.
저는 학술연구에 활용하기 위해서 이 수업을 듣고 있습니다.
파이썬 관련해서 예전에 다른 인터넷 강의를 듣었는데 이해가 잘 안돼서 흥미를 잃고 있었는데, 선생님께서는 너무 쉽게 설명해주셔서 많은 도움이 되고 있습니다. 감사합니다.
저는 수업내용을 바탕으로 신문기사를 크롤링하는 실습을 해보았습니다. 해당 신문사에서 키워드로 기사를 검색한 후 제목을 크롤링하고, 각 기사에 들어가서 기사 내용을 크롤링하는 방식으로 여러 페이지에 걸쳐 진행하는 작업을 하였습니다.
그런데 다수의 기사의 제목과 내용을 크롤링하다보니까 대부분은 동일한 구조를 가지고 작성되어 있어서 원하는 데이터를 추출할 수 있었지만,
간혹 다른 구조로 작성된 기사가 있어서 제가 추출을 원하는 부분의 css 언어와 불일치하여 None으로 표기가 되며 크롤링을 멈추는 상황이 발생하였습니다.
이럴 경우에 None으로 표기되는 기사를 건너뛰고 후속작업을 계속 진행하게 하려면 어떻게 해야하나요? 제가 if 구문을 사용해서 작성을 해보려고 하였는데 데이터가 없다는 것을 어떻게 표현해야할지 모르겠습니다.
감사합니다.
답변 2
0
저도 같은 질문을 하려고 들어왔다가 강사님 답변을 보고 아래와 같이 해결해보았습니다. 비슷한 고민을 하신 분들께 도움이 되길 바라면서 코드 첨부해봅니다.
import requests
from bs4 import BeautifulSoup
import openpyxl
res = requests.get('http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G01')
soup = BeautifulSoup(res.content, 'html.parser')
excel_file = openpyxl.Workbook()
excel_sheet = excel_file.active
excel_sheet.column_dimensions['B'].width = 100
excel_sheet.column_dimensions['C'].width = 20
excel_sheet.column_dimensions['D'].width = 20
excel_sheet.column_dimensions['E'].width = 20
excel_sheet.append(['랭킹', '상품명', '할인 전 가격', '할인률', '할인된 가격'])
if res.status_code == 200 :
best_list = soup.select('div.best-list')
best_item = best_list[1]
products = best_item.select('ul > li')
for index, item in enumerate(products):
name = item.select_one('a.itemname')
origin_price = item.select_one('div.o-price')
sale_price = item.select_one('div.s-price > strong')
sale_percent = item.select_one('div.s-price em')
discount_percent = 0
original_price = 0
if sale_percent == None :
discount_percent = str('0%')
original_price = sale_price.get_text()
else :
discount_percent = sale_percent.get_text()
original_price = origin_price.get_text()
print(str(index+1), name.get_text(), original_price, discount_percent, sale_price.get_text())
excel_sheet.append ( [str(index+1), name.get_text(), original_price, discount_percent, sale_price.get_text()])
else :
print ("Error Code:", res.status_code)
excel_file.save('G_market_item_list.xlsx')
excel_file.close()
0
안녕하세요. 우선 이렇게 말씀해주셔서 감사합니다. 특히 흥미를 잃었는데, 이 강의로 도움이 되었다는데 대해서, 저도 보람이 되네요.
말씀하신 부분은 역시 각 사이트마다 다릅니다. css selector 로 추출된 값이 없다면, if 해당변수.get_text() == None: 으로 가볍게 구분이 가능하지만, 그렇지 않은 경우는 해당 값을 print 문으로 출력해서, 해당 값에 맞게 if 문을 써주시면 됩니다. 예를 들어 해당 값이 단순 스페이스라면, if 해당변수.get_text() == ' ': 이 정도로 써주셔도 될 것 같습니다.
감사합니다.