我有以下代码删除所有标签。现在我想只剥离锚标签。
x = re.compile(r'<[^<]*?/?>')
如何修改以便仅剥离锚标记。
答案 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
可能不是大量文本中效率最高但效果不错。