在Python中匹配HTML标签

2 投票
4 回答
627 浏览
提问于 2025-04-16 21:09

我正在写一段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

你可能想看看这个问题,还有很多评论和回答。:-)

可以使用

来解析HTML内容。

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)

撰写回答