【问题标题】:Get all tags except a list of tags BeautifulSoup获取除标签列表之外的所有标签 BeautifulSoup
【发布时间】:2019-10-30 19:31:48
【问题描述】:

我必须从带有文本边界的网站中提取文本,即包含在标签内。

我想过滤掉所有不需要的标签,例如

'style', 'script', 'head', 'title', 'meta', '[document]'

并从其余标签中获取文本

例如:

HTML

<script>console.log('hello');</script>
<span>Header</span>
<p>Some paragraph</p>

输出

['Header', 'Some paragraph']

我知道我能做到

soup.findall('span', text=True) 

p 和其他包含文本的标签以此类推

这效率不高,因此我需要一种替代方法来过滤掉所有不需要的元素,然后获取文本。

【问题讨论】:

  • 你看过this问题帖吗?
  • @debuggingXD 这很好,但不能解决我的问题。

标签: python web-scraping beautifulsoup


【解决方案1】:

您可以首先从您的汤对象中删除所有不需要的标签,如下所示:

代码:

from bs4 import BeautifulSoup as bs

html = """<script>console.log('hello');</script>
<span>Header</span>
<p>Some paragraph</p>
"""
tags = ['style', 'script', 'head', 'title', 'meta', '[document]']
soup = bs(html, 'html.parser')

for t in tags:
    [s.extract() for s in soup(t)]

for el in soup.find_all():
    print(el.text)

输出:

Header
Some paragraph

然后你可以看到script标签消失了,你可以随意处理soup对象

【讨论】:

  • 我无法理解这一点。你能解释更多吗?
  • @Vishnudev 当然! extract 是一种允许您从汤元素中提取字符串或元素的方法。请参见此处:crummy.com/software/BeautifulSoup/bs4/doc/#extract 在我的 sn-p 中,它读取了 tags 列表并提取了您在其中列出的所有元素(在这种情况下只有一个 script)并更新您的初始汤元素。所以你终于有了&lt;span&gt;Header&lt;/span&gt; &lt;p&gt;Some paragraph&lt;/p&gt;
  • 这个有问题。由于嵌套标签,我会在遍历每个元素时得到重复的文本。
  • 这行得通。而不是使用 find_all 进行迭代,我需要直接使用文本以避免重复。
【解决方案2】:

如果你使用最新版本的 BeautifulSoup(我使用 beautifulsoup4==4.7.1),你可以使用 CSS :not 选择器(doc):

from bs4 import BeautifulSoup

data = '''
<script>console.log('hello');</script>
<span>Header</span>
<document>This is document</document>
<p>Some paragraph</p>
'''

soup = BeautifulSoup(data, 'lxml')

l = [tag.text for tag in soup.body.select(':not(style, script, head, title, meta, document)')]
print(l)

打印:

['Header', 'Some paragraph']

【讨论】:

  • 这个有问题。由于嵌套标签,我会在遍历每个元素时得到重复的文本。
  • @Vishnudev 你能提供你页面的 URL 或 HTML 代码吗?
  • 没有。它应该是通用的。我有 250 个网址。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2021-05-13
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多