我刚刚用.find_all('li')
打印了li的所有内容,我想在li标记结束后继续打印**'p'标记,比如不在html开头或中间的'p'**标记。'p'标记或结尾的剩余标记。请帮助。基本上需要最终列表结束标记后的所有内容。
from bs4 import BeautifulSoup
html_doc = """\
<html>
<p>
don't need this
</p>
<li>
text i need
</li>
<li>
<p>
don't need this
</p>
<p>
don't need this
</p>
<li>
text i need
<ol>
<li>
text i need but appended to parent li tag
</li>
<li>
text i need but appended to parent li tag
</li>
</ol>
</li>
<li>
text i need
</li>
<p>
also need this
</p>
<p>
and this
</p>
<p>
and this too
</p>"""
soup = BeautifulSoup(html_doc, "html.parser")
for li in soup.select("li"):
if li.find_parent("li"):
continue
print(" ".join(li.text.split()))
print("--sep--")
这张照片
text i need
--sep--
text i need text i need but appended to parent li tag text i need but appended to parent li tag
--sep--
text i need
--sep--
感谢@Andrej Kesely
"我需要这个"
text i need
--sep--
text i need text i need but appended to parent li tag text i need but appended to parent li tag
--sep--
text i need
--sep--
also need this
--sep--
and this
--sep--
and this too
--sep--
1条答案
按热度按时间2hh7jdfx1#
您可以尝试以下操作:
(使用
:not(li li)
可以使您不需要if li.find_parent("li"): continue
部分。)这应该能让你
li
标记的文本,但仅由直接位于li
标记内部或li
标记内部的字符串组成然后再
p
标记的文本,这些标记是前一个最外层li
标记的同级标记。(如果只需要在 lastli
之后的p
标记,请使用for p in soup.select("li:not(li li) ~ p:not(:has(~ li))")...
)