我在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
答案 0 :(得分:3)
您可以使用lambda
方法中的find
来选择元素,例如:
soup.find('document').find(lambda tag : tag.name == 'type' and 'DOCA' in tag.text)
然后,您可以使用extract
或decompose
删除该元素。
编辑:使用此表达式选择所有元素:
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>