我正在使用python&#39; BeautifulSoup来解析一些HTML。问题是我想只提取文件的文本,而不是<ul>
和<li>
标签。排序与unwrap()相反。因此,我想要一个具有以下行为的函数parse_everything_but_lists
>>> parse_everything_but_lists("Hello <a>this</a> is <ul><li>me</li><li><b>Dr</b> Pablov</li></ul>")
"Hello this is <ul><li>me</li><li>Dr Pablov</li></ul>"
答案 0 :(得分:1)
你仍然可以使用unwrap
,你只需要有点递归。
from bs4 import Tag
def unwrapper(tags, keep = ('ul','li')):
for el in tags:
if isinstance(el,Tag):
unwrapper(el) # recurse first, unwrap later
if el.name not in keep:
el.unwrap()
演示:
s = '''"Hello <a>this</a> is <ul><li>me</li><li><b>Dr</b> Pablov</li></ul>"'''
soup = BeautifulSoup(s, 'html.parser') # force html.parser to avoid lxml's auto-inclusion of <html><body>
unwrapper(soup)
soup
Out[63]: "Hello this is <ul><li>me</li><li>Dr Pablov</li></ul>"
这种方法适用于任何标签的任意嵌套,即
s = '''"<a><b><ul><c><li><d>Hello</d></li></c></ul></b></a>"'''
soup = BeautifulSoup(s, 'html.parser')
unwrapper(soup)
soup
Out[19]: "<ul><li>Hello</li></ul>"