只剥离html锚标签

时间:2010-04-07 10:03:34

标签: python regex

我有以下代码删除所有标签。现在我想只剥离锚标签。

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

如何修改以便仅剥离锚标记。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

这将匹配'a'或'A'后跟单词边界。请注意,它不会清除结束标记。

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

也会删除结束标记。

修改:
实际上,将[^<]切换为[^>]感觉更可靠,就像这样。

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

答案 2 :(得分:1)

我不确定这个Python是否正确(我是一个PHP人员,但我刚刚开始学习python)。

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

这不会一次删除所有锚标记,因此您可能需要遍历html字符串。它匹配锚标记并将匹配替换为标记的内容。所以...

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

可能不是大量文本中效率最高但效果不错。