如何从多个HTML标签检索文本数据?



我将以下HTML片段输出存储在类型为bs4.element.Tag的名为content的变量中。

<li class="item">
Alpha-tocopherol
<em>see</em>
<a href="https://medlineplus.gov/vitamine.html">Vitamin E</a>
</li>

str(content)输出:

'<li class="item">n                                            Alpha-tocopheroln                                            <em>see</em>n<a href="https://medlineplus.gov/vitamine.html">Vitamin E</a>n</li>'

我想用Python得到作为输出:['Alpha-tocopherol', 'Vitamin E']。我尝试了以下操作,但它是错误的:

regex = re.compile('(w+s+)n')
regex.sub('', content.text).split()

您可以使用.contents方法获得第一个标记,然后使用.find_next()方法搜索a标记。

from bs4 import BeautifulSoup
html = """
<li class="item">
Alpha-tocopherol
<em>see</em>
<a href="https://medlineplus.gov/vitamine.html">Vitamin E</a>
</li>
"""
soup = BeautifulSoup(html, "html.parser")
for tag in soup.find_all("li", class_="item"):
print([tag.contents[0].strip(), tag.find_next("a").text])

输出:

['Alpha-tocopherol', 'Vitamin E']

这两种方法都将生成您想要的列表。对于第一个,它取决于html元素是如何被解析的。如果有分页符n,则必须进行一些额外的解析。

html = '''<li class="item">Alpha-tocopherol<em>see</em><a href="https://medlineplus.gov/vitamine.html">Vitamin E</a></li>'''
soup = BeautifulSoup(html, "html.parser")
soup.text.split('see') # option 1, get all text and parse accordingly from soup object
soup.find('li', class_='item').text.split('see') # option 2, get text from li element (seems like it'd be less efficient to do this)

输出
['Alpha-tocopherol, 'Vitamin E']

最新更新