首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在美汤中只提取单个标签

在美汤中只提取单个标签
EN

Stack Overflow用户
提问于 2022-11-10 12:21:31
回答 3查看 51关注 0票数 0

我在寻找一种只提取没有其他标签的标签的方法

例如:

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup
html = """
<p><a href='XYZ'>Text1</a></p>
<p>Text2</p>
<p><a href='QWERTY'>Text3</a></p>
<p>Text4</p>
"""
soup = BeautifulSoup(html, 'html.parser')
soup.find_all('p')

给出

代码语言:javascript
运行
复制
[<p><a href="XYZ">Text1</a></p>,
 <p>Text2</p>,
 <p><a href="QWERTY">Text3</a></p>,
 <p>Text4</p>]

这就是我想要达到的目标:

代码语言:javascript
运行
复制
[<p>Text2</p>,
 <p>Text4</p>]
EN

回答 3

Stack Overflow用户

发布于 2022-11-10 13:09:31

您可以在没有其他标记的情况下过滤Tag,如下所示:

代码语言:javascript
运行
复制
for tag in soup.find_all('p'):
    if isinstance(tag.next, str):
        print(tag)

回传

代码语言:javascript
运行
复制
<p>Text2</p>
<p>Text4</p>
票数 2
EN

Stack Overflow用户

发布于 2022-11-10 12:32:13

之后,我只需在标记长度上使用if/else对其进行过滤,如果它仅为p,那么它将为空,否则将被过滤掉:

代码语言:javascript
运行
复制
for x in soup.find_all('p'):
    if len([x.tag for x in x.find_all()]) == 0:
        print(x)

只返回:

代码语言:javascript
运行
复制
<p>Text2</p>
<p>Text4</p>
票数 0
EN

Stack Overflow用户

发布于 2022-11-10 13:56:59

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup

html = """
<p><a href='XYZ'>Text1</a></p>
<p>Text2</p>
<p><a href='QWERTY'>Text3</a></p>
<p>Text4</p>
<p>Text6: <a href='QWERTY'>Text5</a></p>
"""

soup = BeautifulSoup(html, 'html.parser')

def p_tag_with_only_strings_as_children(tag):
    return tag.name == "p" and all(isinstance(x, str) for x in tag.children)

result = soup.find_all(p_tag_with_only_strings_as_children)

print(result)

结果:

代码语言:javascript
运行
复制
[<p>Text2</p>, <p>Text4</p>]

全部()

用于检查列表学分中的类型。

https://stackoverflow.com/a/32705845/5288820

或者使用CSS-选择器:https://beautiful-soup-4.readthedocs.io/en/latest/#css-selectors

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup

html = """
<p><a href='XYZ'>Text1</a></p>
<p>Text2</p>
<p><a href='QWERTY'>Text3</a></p>
<p>Text4</p>
<p>Text6: <a href='QWERTY'>Text5</a></p>
""".replace('\n',"")

soup = BeautifulSoup(html, 'html.parser')

print(soup.select('p:not(:has(*))'))
#or in case you only want to filter out "a" tags:
print(soup.select('p:not(:has(a))'))

结果:

代码语言:javascript
运行
复制
[<p>Text2</p>, <p>Text4</p>]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74388919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档