我使用的是python汤。
我的html中有几个<div>
层,内部<div>
标记中有一个id=page-break属性。我能写一个通用代码吗?我可以从外层获得*<div>*
吗?所有*<div>*
都是平行的,即它们在同一层。
包含id=分页符的div层可以在第二个内层或第三个内层。并且我们无法从*<div>*
层获得任何信息。
我不想得到最外层的div,而是我列出的带有星号的div。
<div>
*<div>*
<div>
<div id=page-break> asdf </div>
</div>
*</div>*
*<div>*
<div id=page-break> qwer </div>
*</div>*
*<div>*
<div>
<div id=page-break> asdf </div>
</div>
<div>
</div>
*</div>*
</div>
我希望我能正确理解你的问题。
您可以使用CSS:root
伪类来引用最上面的<div>
,然后使用:has(#page-break)
来获得包含id=page-break
:的所有<div>
from bs4 import BeautifulSoup
html = """
<div>
<div>
<div>
<div id=page-break> asdf </div>
</div>
</div>
<div>
<div id=page-break> qwer </div>
</div>
<div>
<div>
<div id=page-break> asdf </div>
</div>
<div>
</div>
</div>
</div>
"""
soup = BeautifulSoup(html, "html.parser")
for div in soup.select(":root > div:has(#page-break)"):
print(div)
print("-" * 80)
打印:
<div>
<div>
<div id="page-break"> asdf </div>
</div>
</div>
--------------------------------------------------------------------------------
<div>
<div id="page-break"> qwer </div>
</div>
--------------------------------------------------------------------------------
<div>
<div>
<div id="page-break"> asdf </div>
</div>
<div>
</div>
</div>
--------------------------------------------------------------------------------
或者:
选择包含id=page-break
的第一个<div>
(任何级别(,然后使用:scope
:
first_div = soup.select_one("div:has(#page-break)")
for div in first_div.select(":scope > div:has(#page-break)"):
print(div)
print("-" * 80)