我有以下html:
gradle
我正在尝试从<div class="what-im-after">
<p>
"content I want"
</p>
<p>
"content I want"
</p>
<p>
"content I want"
</p>
<div class='not-what-im-after">
<p>
"content I don't want"
</p>
</div>
<p>
"content I want"
</p><p>
"content I want"
</p>
</div>
容器的子元素段落标记中提取所有内容,而不是在<div class="what-im-after">
容器中找到的内容。
当我这样做时:
<div class="not-what-im-after">
我收回了所有soup = Beautifulsoup(html.text, 'lxml')
content = soup.find('div', class_='what-im-after').findAll('p')
个标签,包括<p>
内的标签,这对我来说是完全合理的;这就是我要求的。
我的问题是如何指示Python获取所有<div class='not-what-im-after>
标记,除非它们位于另一个SubElement中?
答案 0 :(得分:1)
如果你只想在what-im-after
div下面的p标签不在任何其他标签内,你想要设置 recursive = False :
soup = BeautifulSoup(html)
print(soup.find('div', class_='what-im-after').find_all("p", recursive=False))
这与检查父级的循环逻辑完全相同。
答案 1 :(得分:0)
在写这个问题的过程中,我想到了一种似乎工作正常的方法。
基本上,我正在检查每个<p>
元素以查看父元素是否为<p>
,这实际上排除了嵌套在子元素中的任何<div class="what-im-after">
标记。
我的代码如下:
<p>
filter_list = []
parent = soup.find('div', class_='what-im-after')
content = soup.find('div', class_='what-im-after').findAll('p')
if content.parent is parent:
filter_list.append(content)
然后包含未嵌套在其他子元素中的所有filter_list
标记。
答案 2 :(得分:-1)
from bs4 import BeautifulSoup
htmltxt = """<div class="what-im-after">
<p>
"content I want"
</p>
<p>
"content I want"
</p>
<p>
"content I want"
</p>
<div class='not-what-im-after">
<p>
"content I don't want"
</p>
</div>
<p>
"content I want"
</p><p>
"content I want"
</p>
</div>"""
soup = BeautifulSoup(htmltxt, 'lxml')
def filter_p(container):
items = container.contents
ans = []
for item in items:
if item.name == 'p':
ans.append(item)
return ans
print(filter_p(soup.div))
也许你想要这个。 而我只是过滤了div的第一级p。