【问题标题】:beautifulsoup find_all titlebeautifulsoup find_all 标题
【发布时间】:2021-01-22 10:10:36
【问题描述】:

html是

<div class="trn-defstat__value">
    <img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-ash.16913d82e3.png" title="ASH" style="height:    35px; padding-right: 8px;"> 
    <img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-jager.600b2773be.png" title="JÄGER"   style="height: 35px; padding-right: 8px;">
    <img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-bandit.385144d970.png" title="BANDIT"     style="height: 35px; padding-right: 8px;">
</div>

我想获取每个 title 的值。

但在那之前,我是这样写的

from bs4 import BeautifulSoup as bs
import requests


bsURL = "https://r6.tracker.network/profile/pc/Spoit.GODSENT"
respinse = requests.get(bsURL)
html = bs(respinse.text, 'html.parser')


title = html.find_all(class_='trn-defstat__value')[4]

print(title)

结果->

<div class="trn-defstat__value">
<img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-ash.16913d82e3.png" style="height: 35px; padding-right: 8px;" title="ASH"/>
<img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-jager.600b2773be.png" style="height: 35px; padding-right: 8px;" title="JÄGER"/>
<img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-bandit.385144d970.png" style="height: 35px; padding-right: 8px;" title="BANDIT"/>
</div>

我该怎么办?

【问题讨论】:

    标签: python beautifulsoup request web-crawler


    【解决方案1】:

    此脚本将打印 Top Operators 部分中的所有 &lt;img&gt; 标题:

    from bs4 import BeautifulSoup as bs
    import requests
    
    
    bsURL = "https://r6.tracker.network/profile/pc/Spoit.GODSENT"
    respinse = requests.get(bsURL)
    html = bs(respinse.text, 'html.parser')
    
    # find Top Operators tag
    operators = html.find(class_='trn-defstat__name', text='Top Operators')
    
    for img in operators.find_next('div').find_all('img'):
        print(img['title'])
    

    打印:

    ASH
    JÄGER
    BANDIT
    

    或者使用 CSS:

    for img in html.select('.trn-defstat__name:contains("Top Operators") + * img'):
        print(img['title'])
    

    【讨论】:

    • 谢谢,我也会考虑到这一点的。
    【解决方案2】:

    只需使用.get()函数获取属性并传入属性名称即可。

    pip install html5lib
    

    我建议你使用它,我相信它是一个更好的解析器。

    from bs4 import BeautifulSoup as bs 
    import requests   
    bsURL = "https://r6.tracker.network/profile/pc/Spoit.GODSENT" 
    
    respinse = requests.get(bsURL) 
    
    
    
    html = bs(respinse.content, 'html5lib')   
    
    
    container = html.find("div", class_= "trn-defstat mb0 top-operators")
    
    
    imgs = container.find_all("img")
    
    
    for img in imgs:
         print(img.get("title"))
    

    我似乎不明白您试图抓取网站的哪个部分,但请注意有时会首先获取 html 代码的 block,其中有您想要抓取的详细信息 :)

    【讨论】:

    • from bs4 import BeautifulSoup as bs import requests bsURL = "https://r6.tracker.network/profile/pc/Spoit.GODSENT" respinse = requests.get(bsURL) html = bs(respinse.text, 'html5lib') imgs = html.find_all("img", class_= "trn-defstat__value") for img in imgs: print(img.get("title")) 我这样写但结果为空
    • 试试response.content而不是response.text
    • 可能class的值是错误的,或者你应该先得到content标签,它有你要刮的imgs标签
    • 那个结果是空的......一样
    • 我已经检查了您要抓取的网站,有很多标签具有 trn-defstat__value 类,因此在 soup 变量中直接使用 .find() 并不好。我建议你先找到包含img标签的html代码块
    【解决方案3】:

    这应该对你有帮助:

    from bs4 import BeautifulSoup
    
    html = """
    <div class="trn-defstat__value">
        <img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-ash.16913d82e3.png" title="ASH" style="height:    35px; padding-right: 8px;"> 
        <img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-jager.600b2773be.png" title="JÄGER"   style="height: 35px; padding-right: 8px;">
        <img src="https://trackercdn.com/rainbow6-ubi/assets/images/badge-bandit.385144d970.png" title="BANDIT"     style="height: 35px; padding-right: 8px;">
    </div>
    """
    soup = BeautifulSoup(html,'html.parser')
    
    imgs = soup.find_all('img')
    
    for img in imgs:
        print(img['title'])
    

    输出:

    ASH
    JÄGER
    BANDIT
    

    完整代码如下:

    from bs4 import BeautifulSoup as bs
    import requests
    
    bsURL = "https://r6.tracker.network/profile/pc/Spoit.GODSENT"
    respinse = requests.get(bsURL)
    html = bs(respinse.text, 'html.parser')
    divs = html.find_all('div',class_ = "trn-defstat__value")
    imgs = []
    for div in divs:
        try:
            imgs.append(div.find_all('img'))
        except:
            pass
    
    imgs = [ele for ele in imgs if ele != []]
    imgs = [j for sub in imgs for j in sub]
    
    for img in imgs:
        print(img['title'])
    

    输出:

    ASH
    JÄGER
    BANDIT
    

    【讨论】:

    • 我像这样更改了我的代码 ``` from bs4 import BeautifulSoup as bs import requests bsURL = "r6.tracker.network/profile/pc/Spoit.GODSENT" respinse = requests.get(bsURL) html = bs(respinse.text, 'html .parser') imgs = html.find_all(".trn-defstat__value")['img'] for img in imgs: print(img.get("title")) ``` 但它是一个错误我该怎么办?
    • @레이화이트raywhite 检查我更新的代码。它工作得很好,没有任何错误
    • 如果您觉得我的回答有帮助,请接受它作为最佳答案。此外,您忘记接受我给出的另一个答案(针对您之前提出的问题)作为最佳答案。确保您甚至接受该答案作为最佳答案。并确保你对我的两个答案都投赞成票。谢谢!
    • 什么意思index = 0 imgs = [ele for ele in imgs if ele != []] imgs = [j for sub in imgs for j in sub]
    • @IceBear 我同意你的看法。但我认为 OP 试图获取所有 div 标签,然后循环通过这些 div 标签来获取图像标题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2016-02-12
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多