2016-03-17 149 views
1

我正在寫一個web刮板來從網站上刮取鏈接。它工作正常,但輸出鏈接不乾淨。它輸出損壞的html鏈接,也檢索相同的html鏈接。這是代碼在python中清除廢棄的url

links = re.findall('<a class=.*?href="?\'?([^"\'>]*)', sourceCode) 
      for link in links: 
       print link  

這是輸出的樣子

/preferences?hl=en&someting 
/preferences?hl=en&someting 
/history/something 
/history/something 
/support?pr=something 
/support?pr=something 
http://www.web1.com/parameters 
http://www.web1.com/parameters 
http://www.web2.com/parameters 
http://www.web2.com/parameters 

我試圖清理未HTML中使用這個正則表達式

link = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', link) 
        print link 

它清潔網址,但增加了方形鏈支架。如何清理這個沒有方括號的地方?我應該如何阻止打印相同的URL兩次或多次

/preferences?hl=en&someting -> [] 
http://www.web1.com/parameters -> [http://www.web1.com/parameters] 
+1

不是一個解決方案,但一個提示:如果你使用'Python'無論如何,你很可能嘗試[Scrapy(http://scrapy.org),這使所有這些要求開箱即用(防止重複,建立一個合適的URL等)。 – Jan

回答

2

您正在收到[]圍繞匹配項目,因爲re.findall返回列表項目

link = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', link) 
# pay attention on iteration over set(links) and not links 
for link in set(links): 
    print link 

請注意,我已將set創建項添加到for loop中,以便以這種方式獲得唯一鏈接,從而防止printng同一個網址。

1

嘗試使用

links = re.findall('href="(http.*?)"', sourceCode) 
links = sorted(set(links)) 

for link in links: 
    print(links) 

這將讓與http在它開始只是鏈接並刪除重複以及排序他們