我必须从带有文字边界(即用标签括起来的边界)的网站中提取文字。
我想过滤掉所有不需要的标签,例如
'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
和其他包含文本的标签
这效率不高,因此我需要一种替代方法来过滤掉所有不需要的元素,然后获取文本。
答案 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']