Python beautifulsoup删除具有特定标记和文本的所有标记/内容

时间:2017-07-07 15:05:01

标签: python beautifulsoup

我在python中使用beautifulsoup并希望从包含在某个标记中的字符串中删除所有内容,并且具有特定的非结束标记,其后面跟着特定的文本。在这个例子中,我想删除所有带有类型标记的文档,文本为DOCA。

让我说我有这样的事情:

<body>
    <document>
        <type>DOCA
            <sequence>1
            <filename>DOCA.htm
            <description>FORM DOCA
            <text>
                <title>Form DOCA</title>
                <h5 align="left"><a href="#toc">Table of Contents</a></h5>
    </document>
    <document>
        <type>DOCB
        <sequence>1
        <filename>DOCB.htm
        <description>FORM DOCB
        <text>
            <title>Form DOCB</title>
            <h5 align="left"><a href="#toc">Table of Contents</a></h5>
    </document>
<body>

我想要删除<document> DOCA 的所有<type>。我尝试了以下但它不起作用:

>>print(soup.find('document').find('type', text = re.compile('DOCA.*')))
None

2 个答案:

答案 0 :(得分:3)

您可以使用lambda方法中的find来选择元素,例如:

soup.find('document').find(lambda tag : tag.name == 'type' and 'DOCA' in tag.text)  

然后,您可以使用extractdecompose删除该元素。

编辑:使用此表达式选择所有元素:

soup.find_all(lambda tag:tag.name == 'document' 
    and tag.find(lambda t:t.name == 'type' and 'DOCA' in t.text))

答案 1 :(得分:1)

您可以查询所有文档,然后在每个文档中查询所有类型,检查其中是否存在DOCA,并删除整个封闭文档。

from bs4 import BeautifulSoup

soup = BeautifulSoup(..., 'html.parser')

for doc in soup.find_all('document'):
    for type in doc.find_all('type'):
        if 'DOCA' in type.text:
            doc.extract()
            break

print(soup)

输出:

<body>

<document>
<type>DOCB
        <sequence>1
        <filename>DOCB.htm
        <description>FORM DOCB
        <text>
<title>Form DOCB</title>
<h5 align="left"><a href="#toc">Table of Contents</a></h5>
</text></description></filename></sequence></type></document>
</body>