2010-12-20 35 views
1

我有我想过滤掉一个或多个链接并保留其他链接的html源代码。从Python源代码中删除特定链接的Python过滤器列表

我已经建立了我的“*”作为通配符过滤器:

<a*>Link1</a>‚ <a*>Link2</a>‚ or <a*>Link3</a> 
<a*>A bad link*</a> 
some text* <a*>update*</a> 
other text right before link <a*>click here</a> 

我想从使用python的HTML源代码的链接的每个实例都过滤掉。我很喜欢将列表加载到数组中。我需要一些过滤器的帮助。每个换行符都表示一个单独的过滤器,我只想删除链接而不是文本

我对python和regex/beautifulsoup仍然很陌生。即使你能指引我正确的方向,它将不胜感激。

+0

这样一个糟糕的链接,如果你只是在单行,并没有别的 wqeqweq? – damir 2010-12-20 23:49:45

+1

您应该使用HTML解析器,如HTMLParser或BeautifulSoup。 HTML不应该用正则表达式解析 – 2010-12-20 23:55:19

+0

我相信从以前的StackOverflow问题这个链接是适当的:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454我同意瑞恩 - 使用像BeautifulSoup一样的HTML解析器。 – kejadlen 2010-12-20 23:59:25

回答

3

要删除<a>标签,只保留不包含这些标签内的文本:

>>> from BeautifulSoup import BeautifulSoup as bs 
>>> markup = """<a*>Link1</a> <a*>Link2</a> or <a*>Link3</a> 
... <a*>A bad link*</a> 
... some text* <a*>update*</a> 
... other text right before link <a*>click here</a>""" 
>>> soup = bs(markup) 
>>> TAGS_TO_EXTRACT = ('a',) 
>>> for tag in soup.findAll(): 
... if tag.name in TAGS_TO_EXTRACT: 
...  tag.extract() 
... 
>>> soup 
    or 

some text* 
other text right before link 

,如果你想在标签或没有内文目前尚不清楚给我。如果你想包含在标签内的文本做这样的事情,而不是:

>>> for tag in soup.findAll(): 
... if tag.name in TAGS_TO_EXTRACT: 
...  tag.replaceWith(tag.text) 
... 
>>> soup 
Link1 Link2 or Link3 
A bad link* 
some text* update* 
other text right before link click here 
0

与重组整个文档丢弃只是部分信息会产生大量的uneeded代码的唯一purose解析它。

所以,我认为这对于正则表达式来说更好。 Python的正则表达式可以有一个回调函数,允许用户自定义替换字符串。在这种情况下,创建一个匹配“坏链接”,其间的文本和末尾链接标记的正则表达式并且仅保留其间的文本是一件简单的事情。

import re 

markup = """<a*>Link1</a>‚ <a*>Link2</a>‚ or <a*>Link3</a> 
<a*>A bad link*</a> 
some text* <a*>update*</a> 
other text right before link <a*>click here</a>""" 

filtered = re.sub (r"(\<a.*?>)(.*?)(\</a\s*\>)",lambda match: match.groups()[1] , markup)