用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 来处理这个问题。存在多个div
和span
,这使得没有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
如何使用 BeautifulSoup 从父子标签中获取文本以放入 DOCX 表中