Python过滤器列表从html源代码中删除某些链接

时间:2010-12-20 23:47:49

标签: python regex beautifulsoup

我有html源代码,我想过滤掉一个或多个链接并保留其他链接。

我已将“*”设置为过滤器:

<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的新手。即使你能指出我正确的方向,也会非常感激。

2 个答案:

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

答案 1 :(得分:0)

解析它只需要重新组装整个文档,只丢弃一部分信息会产生大量不需要的代码。

所以,我认为这对于正则表达式来说更好。 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)