2010-12-20 66 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)