首页 > 解决方案 > 如何将我的功能应用于 eBay Scraper 页面上的所有列表项“li class”

问题描述

python 和 BeautifulSoup 的新手。

我无法将我的函数应用于此 eBay 已售商品页面上的所有列表项(li 类)。

每个已售出的列表都显示为一个 li 类。下面是网址。

https://www.ebay.com/sch/i.html?_from=R40&_nkw=2017+patrick+mahomes+psa+10+auto&_sacat=0&LH_TitleDesc=0&LH_Complete=1&LH_Sold=1&_ipg=100

这是我的代码...

def rookie_card_info(url):
    r = requests.get(url)
    
    soup = bs(r.content)
    
    contents = soup.prettify()
    
    rookie_card_list = soup.find_all(class_="srp-results srp-list clearfix")
    
    #How to to apply to all list items
    
    display_image = soup.find(class_="s-item__image-img")
    img_src = display_image.get('src')
    test = Image(img_src)
    display(test)
    print(img_src)

    display_card = soup.find(class_="s-item__link")
    card_title = display_card.find("h3")
    get_card_title = card_title.text
    print(get_card_title)

    display_sold_price = soup.find(class_="s-item__detail s-item__detail--primary")
    card_sold_price = display_sold_price.find("span")
    sold_price_text = card_sold_price.find(class_="POSITIVE")
    print(sold_price_text.string)

    display_sold_date = soup.find(class_="s-item__ended-date s-item__endedDate")
    card_sold_date = display_sold_date.string
    print(card_sold_date)
    
rookie_card_info("https://www.ebay.com/sch/i.html?_from=R40&_nkw=2017+patrick+mahomes+psa+10+auto&_sacat=0&LH_TitleDesc=0&LH_Complete=1&LH_Sold=1&_ipg=100")

我编写了以下代码行,试图识别页面上包含已售结果页面上所有li 类对象的特定类(大约有 65 个结果)。

rookie_card_list = soup.find_all(class_="srp-results srp-list clearfix")

当我从这行代码打印 html 时。它包含我需要为我的数据解析的所有正确的 html。

我正在解析的数据是图像 URL、标题、销售日期和销售价格。

我得到正确的数据,如下所示......

https://i.ebayimg.com/thumbs/images/g/2BwAAOSwETVfzAFT/s-l225.jpg
2017 Armed & Dangerous Patrick Mahomes Auto MINT Condition PSA 10? Rookie Signed
$2,500.00
Dec-27 12:46

但是,我只从页面上的第一个“li 类”列表中获取数据。而不是所有 65 个结果的数据。

问题:

我该怎么做才能获取所有 65 个结果的数据。我需要一个可以应用于不同 URL 的“即插即用”解决方案。

标签: pythonhtmlpython-3.xweb-scrapingbeautifulsoup

解决方案


我不会为你写完整的答案。相反,请指点:

  1. 获取卡片列表:

    rookie_card_list = soup.select('.s-item')

然后遍历其中的每个项目:

for current_card in rookie_card_list:
  1. 重新编写你的函数来解决current_cardwhile循环,即让一个单独的函数生成汤,然后有另一个函数专门接收你当前的卡并从该卡返回你想要的项目列表(也许然后添加到整体全局列表,您稍后会转向数据框?)。添加任何错误处理,例如如果没有找到返回什么?

例如

def items_from_current_card(current_card):
    card_title = current_card.find("h3").text
    # etc
    return [card_title, ......]
  1. 恐怕很少有即插即用的网络抓取答案。您需要制定一个足够通用的解决方案来处理尽可能多的页面。

推荐阅读