如何使用python sub删除<p> </p>

时间:2011-03-23 13:56:00

标签: python html string

我有一个html文件,我想用空格替换空段落。

mystring = "This <p></p><p>is a test</p><p></p><p></p>"
result = mystring.sub("<p></p>" , "&nbsp;")

这不起作用。

6 个答案:

答案 0 :(得分:10)

don't try to parse HTML with regular expressions。使用适当的解析模块,如htmlparserBeautifulSoup来实现此目的。 “受苦”现在是一个短暂的学习曲线并受益:

  1. 您的解析代码将更加强大,处理您可能没有考虑过使用正则表达式失败的极端情况
  2. 对于未来的HTML解析/修改任务,您将有权更快地完成任务,因此最终时间投资也会得到回报。
  3. 你不会后悔的!保证利润!

答案 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>元素,而不是用&nbsp替换它们。使用lxml,我不确定一个简单的方法,所以我创建了另一个问题:

答案 2 :(得分:2)

我认为对于这个特殊问题,解析模块会过度

只是那个功能:

>>> mystring = "This <p></p><p>is a test</p><p></p><p></p>"

>>> mystring.replace("<p></p>","&nbsp;")
'This &nbsp;<p>is a test</p>&nbsp;&nbsp;'

答案 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("&nbsp;"))

print null_paragraph.transformString(mystring)

打印:

This &nbsp;<p>is a test</p>&nbsp;&nbsp;&nbsp;

答案 4 :(得分:1)

使用regexp?

import re
result = re.sub("<p>\s*</p>","&nbsp;", 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)