在 Beautifulsoup Python 上排除不需要的标签
Posted
技术标签:
【中文标题】在 Beautifulsoup Python 上排除不需要的标签【英文标题】:Exclude unwanted tag on Beautifulsoup Python 【发布时间】:2017-04-07 05:24:17 【问题描述】:<span>
I Like
<span class='unwanted'> to punch </span>
your face
</span>
如何打印“我喜欢你的脸”而不是“我喜欢打你的脸”
我试过了
lala = soup.find_all('span')
for p in lala:
if not p.find(class_='unwanted'):
print p.text
但它给 “TypeError:find() 没有关键字参数”
【问题讨论】:
您可以尝试extract()
在获取文本之前从 html 中删除标签。
*** 上最人性化的问题之一 :)
【参考方案1】:
您可以使用extract()
在获取文本之前删除不需要的标签。
但它会保留所有 '\n'
和 spaces
,因此您需要进行一些工作才能删除它们。
data = '''<span>
I Like
<span class='unwanted'> to punch </span>
your face
<span>'''
from bs4 import BeautifulSoup as BS
soup = BS(data, 'html.parser')
external_span = soup.find('span')
print("1 HTML:", external_span)
print("1 TEXT:", external_span.text.strip())
unwanted = external_span.find('span')
unwanted.extract()
print("2 HTML:", external_span)
print("2 TEXT:", external_span.text.strip())
结果
1 HTML: <span>
I Like
<span class="unwanted"> to punch </span>
your face
<span></span></span>
1 TEXT: I Like
to punch
your face
2 HTML: <span>
I Like
your face
<span></span></span>
2 TEXT: I Like
your face
您可以跳过外部跨度内的每个 Tag
对象并仅保留 NavigableString
对象(它是 HTML 中的纯文本)。
data = '''<span>
I Like
<span class='unwanted'> to punch </span>
your face
<span>'''
from bs4 import BeautifulSoup as BS
import bs4
soup = BS(data, 'html.parser')
external_span = soup.find('span')
text = []
for x in external_span:
if isinstance(x, bs4.element.NavigableString):
text.append(x.strip())
print(" ".join(text))
结果
I Like your face
【讨论】:
extract() 有效,但前提是您只有一个不需要的。如果我有 2 个不需要的类标签怎么办?extract()
仅删除一个元素,但如果您找到更多元素,则可以将其与每个元素一起使用 - 例如在 for 循环中。
有没有办法做到这一点,它不会假设文件足够小以完全读入内存,除非我们要排除的标签实际上被排除在外?就像选择性地排除某些标签之间的字符一样?还是分块读取?【参考方案2】:
您可以像这样轻松找到(不)想要的文本:
from bs4 import BeautifulSoup
text = """<span>
I Like
<span class='unwanted'> to punch </span>
your face
<span>"""
soup = BeautifulSoup(text, "lxml")
for i in soup.find_all("span"):
if 'class' in i.attrs:
if "unwanted" in i.attrs['class']:
print(i.text)
从这里输出其他一切都可以轻松完成
【讨论】:
以上是关于在 Beautifulsoup Python 上排除不需要的标签的主要内容,如果未能解决你的问题,请参考以下文章