仅去除HTML锚点标签

0 投票
3 回答
2077 浏览
提问于 2025-04-15 21:19

我有一段代码,它可以去掉所有的标签。现在我想要的只是去掉链接标签。

x = re.compile(r'<[^<]*?/?>')

我该怎么改才能只去掉链接标签呢?

3 个回答

1
x = re.compile(r'<[aA]\>[^<]*?/?>')

这个会匹配字母'a'或'A'后面跟着一个单词的边界。注意,它不会去掉结束标签。

x = re.compile(r'</?[aA]\>[^<]*?/?>')

会把结束标签也去掉。

编辑:
其实,把[^<]换成[^>]感觉更可靠,像这样。

x = re.compile(r'</?[aA]\>[^>]*?/?>')
1

我不太确定这个Python代码是否正确(我主要是做PHP的,但现在开始自己学习Python)。

re.sub('<[aA][^>]*>([^<]+)</[aA]>','\1','<html><head> .... </body></html>')

这个方法一次不能把所有的锚点标签都去掉,所以你可能需要对整个HTML字符串进行循环处理。它会找到锚点标签,然后把找到的内容替换掉。所以……

<a href="/">homepage</a> -> homepage

在处理大量文本时,这个方法可能不是最有效的,但它是可以工作的。

5

以下代码可以去掉所有标签。

其实并不是这样。<div title="a>b"> 是有效的HTML,但会被搞得一团糟。<div title="<" onmouseover="script()" class="<">"> 是无效的HTML,但在真实网页上你经常会看到这种情况。你的正则表达式会留下一个包含危险脚本的活跃标签。

如果你想处理HTML,比如去掉标签,单靠正则表达式是行不通的,除非你对输入的内容限制得非常严格。最好使用一个真正的HTML解析器,逐步处理生成的文档,去掉不需要的元素。

比如,可以使用BeautifulSoup

def replaceWithContents(element):
    ix= element.parent.contents.index(element)
    for child in reversed(element.contents):
        element.parent.insert(ix, child)
    element.extract()

doc= BeautifulSoup(html) # maybe fromEncoding= 'utf-8'
for link in doc.findAll('a'):
    replaceWithContents(link)
str(doc)

撰写回答