获取所有标签,除了标签列表BeautifulSoup

时间:2019-06-17 08:17:39

标签: python web-scraping beautifulsoup

我必须从带有文字边界(即用标签括起来的边界)的网站中提取文字。

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

'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和其他包含文本的标签

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

2 个答案:

答案 0 :(得分: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标签消失了,您可以根据需要处理汤对象

答案 1 :(得分:1)

如果您使用的是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']