在 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 上排除不需要的标签的主要内容,如果未能解决你的问题,请参考以下文章

python安装BeautifulSoup注意事项

python爬虫之BeautifulSoup

python3.4 使用BeautifulSoup

在一列上排名表,同时在另一列上排序

在Python中导入BeautifulSoup时出错

python爬虫(十九)BeautifulSoup4库