BeautifulSoup4解析除特定标签之外的所有内容

时间:2014-04-26 00:50:38

标签: python beautifulsoup

我正在使用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>"

1 个答案:

答案 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>"