我有一个html文件,我想用空格替换空段落。
mystring = "This <p></p><p>is a test</p><p></p><p></p>"
result = mystring.sub("<p></p>" , " ")
这不起作用。
答案 0 :(得分:10)
请don't try to parse HTML with regular expressions。使用适当的解析模块,如htmlparser
或BeautifulSoup
来实现此目的。 “受苦”现在是一个短暂的学习曲线并受益:
你不会后悔的!保证利润!
答案 1 :(得分:5)
我认为用一个真正的解析器给出一个如何做到这一点的例子总是很好的,并且只是重复Eli Bendersky在他的回答中给出的声音建议。
以下是如何使用lxml删除空<p>
元素的示例。 lxml的HTMLParser
处理HTML非常好。
from lxml import etree
from StringIO import StringIO
input = '''This <p> </p><p>is a test</p><p></p><p><b>Bye.</b></p>'''
parser = etree.HTMLParser()
tree = etree.parse(StringIO(input), parser)
for p in tree.xpath("//p"):
if len(p):
continue
t = p.text
if not (t and t.strip()):
p.getparent().remove(p)
print etree.tostring(tree.getroot(), pretty_print=True)
...产生输出:
<html>
<body>
<p>This </p>
<p>is a test</p>
<p>
<b>Bye.</b>
</p>
</body>
</html>
请注意,我在回复此问题时误解了这个问题,我只删除空的<p>
元素,而不是用 
替换它们。使用lxml,我不确定一个简单的方法,所以我创建了另一个问题:
答案 2 :(得分:2)
我认为对于这个特殊问题,解析模块会过度
只是那个功能:
>>> mystring = "This <p></p><p>is a test</p><p></p><p></p>"
>>> mystring.replace("<p></p>"," ")
'This <p>is a test</p> '
答案 3 :(得分:2)
如果<p>
输入<P>
或< p >
,或者添加了属性,或者使用空标记语法<P/>
给出了什么,该怎么办? Pyparsing的HTML标记支持处理所有这些变体:
from pyparsing import makeHTMLTags, replaceWith, withAttribute
mystring = 'This <p></p><p>is a test</p><p align="left"></p><P> </p><P/>'
p,pEnd = makeHTMLTags("P")
emptyP = p.copy().setParseAction(withAttribute(empty=True))
null_paragraph = emptyP | p+pEnd
null_paragraph.setParseAction(replaceWith(" "))
print null_paragraph.transformString(mystring)
打印:
This <p>is a test</p>
答案 4 :(得分:1)
使用regexp?
import re
result = re.sub("<p>\s*</p>"," ", mystring, flags=re.MULTILINE)
如果经常使用,请编译正则表达式。
答案 5 :(得分:0)
我写了那段代码:
from lxml import etree
from StringIO import StringIO
html_tags = """<div><ul><li>PID temperature controller</li> <li>Smart and reliable</li> <li>Auto-diagnosing</li> <li>Auto setting</li> <li>Intelligent control</li> <li>2-Rows 4-Digits LED display</li> <li>Widely applied in the display and control of the parameter of temperature, pressure, flow, and liquid level</li> <li> </li> <p> </p></ul> <div> </div></div>"""
document = etree.iterparse(StringIO(html_tags), html=True)
for a, e in document:
if not (e.text and e.text.strip()) and len(e) == 0:
e.getparent().remove(e)
print etree.tostring(document.root)