使用的版本:BS4、lxml、Python3.9
假设我有一些 HTML:
<div>
<p>Hello</p>
<h1>hi</h1>
<div id="hello"></div>
<h1>Hello</h1>
</div>
如果我选择了一些 HTML:legal_div = soup.find(id="hello")
,我怎么能丢弃或忽略之前的任何标签 legal_div
.我更喜欢使用 lxml,但如果不可能,那么 html.parser 也可以。
编辑:当我说丢弃时,我的意思是如果我要搜索任何 <h1>
标签,我应该只看到“你好”,而不是“嗨”
最佳答案
我不太确定你想要什么。如果您只需要找到特定的 <h1>
标记,然后按照 Andrej 的方式获取该元素,然后 find_next()
h1标签。
但是如果你需要改变 html,你可以得到所有的 h1 标签并使用 .decompose()
任何不符合您指定标准的:
from bs4 import BeautifulSoup
html = '''<div>
<p>Hello</p>
<h1>hi</h1>
<div id="hello"></div>
<h1>Hello</h1>
</div>'''
soup = BeautifulSoup(html, 'html.parser')
print('\tBefore:\n\n%s' %soup)
all_h1 = soup.find_all('h1')
print('\n',all_h1)
for each in all_h1:
if each.find_previous().name == 'div' and each.find_previous().attrs['id'] == 'hello':
continue
else:
each.decompose()
print('\n\n\tAfter:\n\n%s' %soup)
all_h1 = soup.find_all('h1')
print('\n',all_h1)
输出:
之前:
<div>
<p>Hello</p>
<h1>hi</h1>
<div id="hello"></div>
<h1>Hello</h1>
</div>
[<h1>hi</h1>, <h1>Hello</h1>]
之后:
<div>
<p>Hello</p>
<div id="hello"></div>
<h1>Hello</h1>
</div>
[<h1>Hello</h1>]
关于python - bs4 丢弃特定标签之前的所有 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68744736/