2013-04-03 103 views
2

我想剥离所有的div。从HTML字符串中删除所有的div标签

输入:

<p>111</p> 

<div class="1334">bla</div> 

<p>333</p> 

<p>333</p> 

<div some unkown stuff>bla2</div> 

所需的输出:

<p>111</p> 

    <p>333</p> 

    <p>333</p> 

我试过,但它不工作:

release_content = re.sub("/<div>.*<\/div>/s", "", release_content) 

回答

8

Do not use regex for this problem。使用一个html解析器。这里是一个与BeautifulSoup Python的解决方案:

from BeautifulSoup import BeautifulSoup 

with open('Path/to/file', 'r') as content_file: 
    content = content_file.read() 

soup = BeautifulSoup(content) 
[div.extract() for div in soup.findAll('div')] 

with open('Path/to/file.modified', 'w') as output_file: 
    output_file.write(str(soup)) 
+0

这很有趣,因为我实际上使用BeautifulSoup并决定使用正则表达式,因为我认为它不适用于BeautifulSoup :) – 2013-04-03 22:09:10

1

你不需要对正则表达式模式的任何定界符在python中:

release_content = re.sub("<div>.*<\/div>", "", release_content) 

您确定div s没有任何属性吗?嵌套0​​s会发生什么?

+0

我想我不清楚。请参阅编辑。 – 2013-04-03 20:15:13

+0

如果它不是最简单的情况,请不要使用正则表达式。 – 2013-04-03 20:49:54

1

您正在使用贪婪运营商:*。它会尽可能地匹配,然后停下来。您可以尝试使用非贪婪版本*?。只要你没有嵌套<div>标签,你会没事的。

release_content = re.sub("(?s)<div>.*?<\/div>", "", release_content) 

如果你能有嵌套<div>标签,那么你要使用的HTML库像BeautifulSoup

根据您的编辑,以解决您可以简单地修改图案的领先<div>属性:

release_content = re.sub("(?s)<div(?: [^>]*)?>.*?<\/div>", "", release_content) 
相关问题