파이썬 공부/기초
[python] 알라딘 중고서점 스크래핑-3
시도하고 시도
2021. 12. 21. 19:34
저번에 마지막으로 이렇게 하면 왜 힘든지 잠깐 언급한걸 살펴본다.(짧다)
books = soup.find_all("div",{"class":"ss_book_box"})
for book in books:
# price = book.find_all("a", {"class":"bo_used"}).find_all 판매분류와 가격이 한번에 뽑힌다.
price = book.select("table > tr > td")[2].select("table.usedtable01 > tr ")[1]
>>> <tr>
<td><a class="bo_used" href="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=193931483"><b>16,200원</b></a></td><td><a class="bo_used" href="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=277382846"><b> 14,400원</b></a></td><td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&TabType=2"><b>11,400원</b></a></td><td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&TabType=3"><b>12,000원</b></a></td><td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&TabType=1"><b>13,000원</b></a></td></tr>
이때에 <td>....16200원..</td><td>....14400원...</td><td>....11400원...</td><td>.....
뭐가 문제점인지 보이는가?
바로 다시 bs4.element요소로 나온다. 그래서 다시
price = book.select("table > tr > td")[2].select("table.usedtable01 > tr ")[1].select("td")
뒤에 select("td")로 써줘야 한다.
이러면 아까와 똑같은 결과를 얻는다.
# 첫번째로 설명한, 좀더 짧은식
price = book.select("table > tr > td")[2].select("table.usedtable01 > tr > td")
# 두번째로 설명한, 중간 선택자로 리스트를 뽑고 인덱싱한 후, 다시 셀렉트를 해준 식
price = book.select("table > tr > td")[2].select("table.usedtable01 > tr ")[1].select("td")
>>> [<td><a class="bo_used" href="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=193931483"><b>16,200원</b></a></td>, <td><a class="bo_used" href="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=277382846"><b> 14,400원</b></a></td>, <td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&TabType=2"><b>11,400원</b></a></td>, <td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&TabType=3"><b>12,000원</b></a></td>, <td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&TabType=1"><b>13,000원</b></a></td>]
이러면 인덱싱으로 가격만 뽑을 수 있다.
비어있는 가격 상관없이 5개씩 뽑아올 수 있다.