Python Beautifulsoup找到所有功能而无需重复

时间:2018-01-17 21:47:02

标签: python beautifulsoup

markup = '<b></b><a></a><p>hey</p><li><p>How</p></li><li><p>are you </p></li>'
soup = BeautifulSoup(markup)
data = soup.find_all('p','li')
print(data)

结果如下所示

['<p>hey</p>,<p>How </p>,<li><p>How</p></li>,<p>are you </p>,<li><p>are you </p></li>']

我怎样才能让它返回

['<p>hey</p>,<li><p>How</p></li>,<li><p>are you </p></li>']

或我可以删除重复的p标签的任何方式谢谢

2 个答案:

答案 0 :(得分:0)

BeautifulSoup不分析html的文本,而是获取所需的标记结构。在这种情况下,您需要执行一个额外的步骤,并检查<p>的文本是否已在不同的结构中看到:

from bs4 import BeautifulSoup as soup
markup = '<b></b><a></a><p>hey</p><li><p>How</p></li><li><p>are you </p></li>'
s = soup(markup, 'lxml')
final_s = s.find_all(re.compile('p|li'))
final_data = [','.join(map(str, [a for i, a in enumerate(final_s) if not any(a.text == b.text for b in final_s[:i])]))]

输出:

['<p>hey</p>,<li><p>How</p></li>,<li><p>are you </p></li>']

答案 1 :(得分:0)

如果您要查找文字而不是<li>标记,则只需搜索<p>标记即可获得所需结果,而无需重复。

>>> data = soup.find_all('p')
>>> data
[<p>hey</p>, <p>How</p>, <p>are you </p>]

或者,如果您只是在寻找文本,可以使用:

>>> data = [x.text for x in soup.find_all('p')]
>>> data
['hey', 'How', 'are you ']