파이썬 공부/기초

[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&amp;TabType=2"><b>11,400원</b></a></td><td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&amp;TabType=3"><b>12,000원</b></a></td><td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&amp;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&amp;TabType=2"><b>11,400원</b></a></td>, <td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&amp;TabType=3"><b>12,000원</b></a></td>, <td><a class="bo_used" href="/shop/UsedShop/wuseditemall.aspx?ItemId=193931483&amp;TabType=1"><b>13,000원</b></a></td>]

이러면 인덱싱으로 가격만 뽑을 수 있다.

비어있는 가격 상관없이 5개씩 뽑아올 수 있다.