【问题标题】:Python BeautifulSoup select div class [duplicate]Python BeautifulSoup选择div类[重复]
【发布时间】:2021-08-02 12:35:22
【问题描述】:

我正在抓取这样的 HTML

<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>

我正在使用这个

soup_object.find_all("div", {"class": "col-xs-12"})

我只想要一个具有“col-16”类的 div,但它会返回所有 div。

如何只选择带有“col-16”的 div 类?

编辑

我想要这个

<div class="col-16"> ... </div>
<div class="col-16"> ... </div>

但我得到了这个

<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>

【问题讨论】:

  • 如果您发布一个更完整的代码示例,并展示您的期望以及运行它的实际收获,这将更容易提供帮助。

标签: python html web-scraping beautifulsoup


【解决方案1】:

我认为这些会有所帮助:

BeautifulSoup webscraping find_all( ): finding exact match

https://medium.com/@epicshane/using-beautifulsoup4-to-find-class-exact-match-3e263a95e330

我已经尝试过来自:https://stackoverflow.com/a/22735249/13548379的解决方案

from bs4 import BeautifulSoup

html_doc = """<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
#print(soup.prettify())
item = soup.find_all(lambda tag: tag.name == 'div' and 
                                   tag.get('class') == ['col-16'])
for x in item:
    print(x.prettify())

结果是:

<div class="col-16">
 ...
</div>

<div class="col-16">
 ...
</div>

【讨论】:

  • 感谢您的回答。这也有效。
【解决方案2】:

只需按类属性的数量过滤 div。

例如:

from bs4 import BeautifulSoup

if __name__ == '__main__':
    sample_html = """<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>
<div class="col-16 text"> ... </div>
<div class="col-16 image"> ... </div>
<div class="col-16"> ... </div>"""
    soup = BeautifulSoup(sample_html, "html.parser").find_all("div")
    filtered = [div for div in soup if len(div.attrs["class"]) == 1]
    print(filtered)

输出:

[<div class="col-16"> ... </div>, <div class="col-16"> ... </div>]

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 2018-08-02
    • 1970-01-01
    • 2014-12-26
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2011-08-04
    相关资源
    最近更新 更多