2017-05-09 42 views
0

我試圖從一個網頁獲取數據,在那裏我跟蹤你的所有鏈接。網頁的建模很糟糕,頁面某些部分的鏈接在鏈接之前和之後都包含空格,所以scrapy隨之而來,您的Web服務器使用301創建循環重定向。Scrapy消毒url鏈接

我試圖過濾鏈接的URL,但它是不可能的,總是返回空格或符號+。代碼

def cleanurl(link_text): 
    print "original: ", link_text 
    print "filter: ", link_text.strip("\s+\t\r\n '\"") 
    return link_text.strip("\s+\t\r\n '\"") 
    #return " ".join(link_text.strip("\t\r\n '\"")) 
    #return link_text.replace("\s", "").replace("\t","").replace("\r","").replace("\n","").replace("'","").replace("\"","") 

rules = (
    Rule (LinkExtractor(allow=(), deny=(), process_value= cleanurl)), 
) 

網頁代碼

<a href= 
          "        ?on_sale=1 
          " 
         class="selectBox">ON SALE 
        </a> 

輸出cleanurl

original: http://www.portshop.com/computers-networking-c_11257/        ?on_sale=1 

filter: http://www.portshop.com/computers-networking-c_11257/        ?on_sale=1 

部分我試圖用正則表達式和其他人,但我不能消毒的URL,在有些情況下,如果它在其他情況下不起作用,請將%20(空格)更改爲+。

謝謝!

+1

你能用更多的URL重構你的問題嗎?可能給我們一些你正在處理的網址,當前的輸出和你期望的輸出。 –

回答

0

我已經解決了,我輸入了下面的代碼來清理URL,現在它正常工作。我希望你能幫助那些和我有同樣問題的人。

def cleanurl(link_text): 
    return ''.join(link_text.split()) 

謝謝大家!

1

您提到「%20」和「+」是網址的一部分,這就是爲什麼我懷疑這些網址是由url編碼的原因。

因此剝奪他們任何空格之前,你需要urldecode它:

使用Python 3:

import urllib 

def cleanurl(link_text): 
    print "original: ", link_text 
    print "filter: ", link_text.strip("\s\t\r\n '\"") 
    link_text = urllib.parse.unquote(link_text) 
    return link_text.strip("\s+\t\r\n '\"") 

如果仍然使用Python 2.7,你需要更換所享有行:

link_text = urllib.unquote(link_text) 
+0

問題是URL是由程序創建的,頁面與左右空格的鏈接不是絕對URL,當連接時,創建%20和其他(編碼) – Anto