【问题标题】:How to extract content from tags with Beautiful soup如何使用 Beautiful soup 从标签中提取内容
【发布时间】:2021-12-04 07:59:18
【问题描述】:

我一直在尝试用漂亮的汤来练习网页抓取。但是每次我改变一个网站时,标签结构都是如此不同,这真的让我很困惑。这次我尝试抓取亚马逊畅销网站(https://www.amazon.com/Best-Sellers-Appstore-Android/zgbs/mobile-apps/ref=zg_bs_unv_mas_1_9408444011_1)的排名,名称,评分,以及评论数量(在下图中圈出)。

我的想法是找到每个项目的“主要”标签,然后挖掘包含我想要的信息的标签。所以我使用了 .select() 并从“li 类”开始。但是当我尝试在“span.a-list-item”之后添加标签时,我会得到以下代码的空结果,

container = page.select('li.zg-item-immersion > span.a-list-item > div.a-section a-spacing-none aok-relative' )

我可以在 .select() 中设置标签限制还是我做错了什么?

所以我停在“span.a-list-item”并尝试了以下方法,但我不明白为什么我的代码有时会给我空结果,有时会返回我想要的东西......我猜这个与网站的连接有关吗?

from bs4 import BeautifulSoup
import requests
url = "https://www.amazon.com/Best-Sellers-Appstore- 
Android/zgbs/mobile-apps/ref=zg_bs_unv_mas_1_9408444011_1"
page = BeautifulSoup(requests.get(url).content,'lxml')    
containers = page.select('li.zg-item-immersion > span.a-list-item')
ranking = (containers[1].find("span",class_="zg-badge-text").text)[1:]

在最后一行,我能够使用那行代码成功获得排名数字,但是当我尝试将它们附加到带有循环的列表中时,

for item in range(50):
   ranking.append((containers[item].find("span",class_="zg-badge-text").text)[1:])

我不断收到“列表索引超出范围”错误,我不明白为什么它超出范围,因为单个页面上有 50 个项目。

最后但并非最不重要的一点是,我能否获得一些关于学习浏览不同网站的建议?我还阅读了 beautifulsoup 文档并按照说明使用不同的功能来获取特定标签,但仍然没有得到我想要的...

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    实际上,在 for 循环之后,它并没有从列表范围内抓取数据作为文本。您还需要将用户代理作为标头注入。

    代码:

    from bs4 import BeautifulSoup
    import requests
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
    url = "https://www.amazon.com/Best-Sellers-Appstore- Android/zgbs/mobile-apps/ref=zg_bs_unv_mas_1_9408444011_1"
    r =requests.get(url, headers = headers)
    page = BeautifulSoup(r.content,'lxml') 
    
    containers = page.select('li.zg-item-immersion > span.a-list-item')
    for container in containers:
        ranking = container.find("span",class_="zg-badge-text").text
        print(ranking)
    

    输出:

    #1
    #2 
    #3 
    #4 
    #5 
    #6 
    #7 
    #8 
    #9 
    #10
    #11
    #12
    #13
    #14
    #15
    #16
    #17
    #18
    #19
    #20
    #21
    #22
    #23
    #24
    #25
    #26
    #27
    #28
    #29
    #30
    #31
    #32
    #33
    #34
    #35
    #36
    #37
    #38
    #39
    #40
    #41
    #42
    #43
    #44
    #45
    #46
    #47
    #48
    #49
    #50
    

    【讨论】:

    • 感谢您的帮助!我想这就是为什么有时它会返回空结果的原因。
    • 我其实还有一个问题,关于如何到达包含名称、评分和评论数量的标签,你认为你可以给我一些提示吗?
    • 您可以通过选择正确的元素来获取名称,评分方式与排名相同
    • 知道了!谢谢!
    猜你喜欢
    • 2017-12-31
    • 2021-02-22
    • 2020-05-04
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多