在Python中匹配HTML标签
我正在写一段Python代码,用来修正HTML代码中标题的大小写。目前,我写出了以下代码:
pattern = re.compile("<h1>(.*)</h1>|<h2>(.*)</h2>|<h3>(.*)</h3>|<h4>(.*)</h4>|<h5>(.*)</h5>|<h6>(.*)</h6>")
def replace(m):
contents = m.group(1)
replacement = contents[0] + contents[1:].lower()
return replacement
接下来,对于给定的一行文本,我使用的转换方式是 line = pattern.sub(replace, line)
。
但这样做不行,因为 m.group(1)
总是返回 None
,而我希望它能返回我正则表达式中任何一个匹配的部分。由于在Python中,模式不能共享名称,我有点不知道该怎么办。
一个明显的解决办法是把我用到的所有模式都分组,但那样的话 <h1>bla</h2>
也会被识别出来。这就不好了,因为 <h1><a href="...">Bla</a></h1> <h2>Bla</h2>
应该能匹配到两个部分(<a href="...">Bla</a>
和 <a href="...">Bla</a>
)。
有什么想法吗?
4 个回答
1
你为什么在乎这个呢?HTML标签是不区分大小写的。如果你需要一个合适的解决方案,可以使用像BeautifulSoup这样的工具。用正则表达式来解析HTML是没意义的,绝对不推荐这样做(这个话题讨论得已经够多了)。
1
5
根据我的理解,你只是想把所有的标题字母大写。你可以使用lxml
这个工具,这样做起来会非常简单。
import lxml.html
doc = lxml.html.parse(your_html)
for i in range(1,7):
for h in doc.xpath('//h%d' % i):
h.text = h.text.capitalize()
print lxml.html.tostring(doc)