python - bs4 丢弃特定标签之前的所有 HTML

标签 python web-scraping beautifulsoup python-requests

使用的版本: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/

相关文章:

python - 使用 lxml 获取值

python - 使用Python 3从MySQL数据库中一张一张地检索多个图像

python - 来自同一页面中多个链接的同一项目中的scrapy数据?

python - 如何使用 beautifulsoup 提取内容

python - 有人可以详细解释一下这段代码是如何工作的(使用 Python 访问 Web 数据)

当键为 "numeric string"时的 python ordereddict

python - 在打印中使用 .format 和格式时如何解决 "Single ' }' encountered in format string"

Python 美丽汤 : Removing specific element in element

python - Scrapy:下载器/response_count 与 response_received_count

python - BeautifulSoup 不让我收到文本