用beautifulsoup通过div标签查找div文本

Posted

技术标签:

【中文标题】用beautifulsoup通过div标签查找div文本【英文标题】:Find div text through div label with beautifulsoup 【发布时间】:2019-10-08 16:43:14 【问题描述】:

假设以下html sn-p,我想从中提取与标签'price'和'ships from'对应的值:

<div class="divName">
    <div>
        <label>Price</label>
        <div>22.99</div>
    </div>
    <div>
        <label>Ships from</label>
        <span>EU</span>
    </div>
</div>

这是一个较大的 html 文件的一部分。假设在某些文件中存在“Ships from”标签,有时不存在。由于 html 内容的可变性,我想使用类似方法的 BeautifulSoup 来处理这个问题。存在多个divspan,这使得没有id 或类名很难选择

我的想法是这样的:

t = open('snippet.html', 'rb').read().decode('iso-8859-1')
s = BeautifulSoup(t, 'lxml')
s.find('div.divName[label*=Price]')
s.find('div.divName[label*=Ships from]')

但是,这会返回一个空列表。

【问题讨论】:

【参考方案1】:

使用select 找到label,然后使用find_next_sibling().text

例如:

from bs4 import BeautifulSoup

html = """<div class="divName">
    <div>
        <label>Price</label>
        <div>22.99</div>
    </div>
    <div>
        <label>Ships from</label>
        <span>EU</span>
    </div>
</div>"""

soup = BeautifulSoup(html, "html.parser")
for lab in soup.select("label"):
    print(lab.find_next_sibling().text)

输出:

22.99
EU

【讨论】:

【参考方案2】:

试试这个:

from bs4 import BeautifulSoup
from bs4.element import Tag

html = """ <div class="divName">
    <div>
        <label>Price</label>
        <div>22.99</div>
    </div>
    <div>
        <label>Ships from</label>
        <span>EU</span>
    </div>
</div>"""

s = BeautifulSoup(html, 'lxml')
row = s.find(class_='divName')

Solutio-1:

for tag in row.findChildren():
    if len(tag) > 1:
        continue
    if tag.name in 'span' and isinstance(tag, Tag):
        print(tag.text)
    elif tag.name in 'div' and isinstance(tag, Tag):
        print(tag.text)

解决方案 2:

for lab in row.select("label"):
    print(lab.find_next_sibling().text)

O/P:

22.99
EU

【讨论】:

【参考方案3】:

您可以使用:contains(使用 bs 4.7.1 和 next_sibling

import requests
from bs4 import BeautifulSoup as bs

html = '''
<div class="divName">
    <div>
        <label>Price</label>
        <div>22.99</div>
    </div>
    <div>
        <label>Ships from</label>
        <span>EU</span>
    </div>
</div>
'''

soup = bs(html, 'lxml')
items = soup.select('label:contains(Price), label:contains("Ships from")')

for item in items:
    print(item.text, item.next_sibling.next_sibling.text)

【讨论】:

以上是关于用beautifulsoup通过div标签查找div文本的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 之 select 总结---1205

python3用BeautifulSoup抓取div标签

通过 beautifulsoup 安全地删除标签中的孩子

如何使用 BeautifulSoup 从父子标签中获取文本以放入 DOCX 表中

Python爬虫教程-25-数据提取-BeautifulSoup4

使用 BeautifulSoup 查找包含特定文本的 HTML 标签