2011-12-19 11 views
9

私は、各URLの終わりにクエリ文字列にランダムな値を追加しているようなサイトをクロールするためにscrapyを使用しています。これはクロールを一種の無限ループに変えています。URLからクエリを削除するにはどうすればよいですか?

URLのクエリ文字列部分を無視するように私はどのようにして治療を行いますか?

答えて

20

urllib.urlparseを参照してください。

例コード:

from urlparse import urlparse 
o = urlparse('http://url.something.com/bla.html?querystring=stuff') 

url_without_query_string = o.scheme + "://" + o.netloc + o.path 

出力例:w3lib.urlモジュール内の関数url_query_cleanerあり

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from urlparse import urlparse 
>>> o = urlparse('http://url.something.com/bla.html?querystring=stuff') 
>>> url_without_query_string = o.scheme + "://" + o.netloc + o.path 
>>> print url_without_query_string 
http://url.something.com/bla.html 
>>> 
+1

'from urllib.parse import urlparse'? –

+0

@RyanCadyはい 'urllib.parseからインポートurlparse'が私のために働いた。 – nipunasudha

6

いくつかのコードを入力してください。

あなたはSgmlLinkExtractorCrawlSpiderRule年代を使用している場合は、SgmlLinkExtractorコンストラクタのパラメータproccess_valueにカスタム機能を提供します。 BaseSgmlLinkExtractor

def delete_random_garbage_from_url(url): 
    cleaned_url = ... # process url somehow 
    return cleaned_url 

Rule(
    SgmlLinkExtractor(
     # ... your allow, deny parameters, etc 
     process_value=delete_random_garbage_from_url, 
    ) 
) 
+0

第1と第2の両方の回答を組み合わせてみると、私の問題は解決するようです。私は両方の答えをどのようにマークすることができないのでしょうか。 –

0

ため

参照ドキュメントあなたは、BaseSpiderを使用して新しい要求をもたらす前に、urlparseを使用してURLのクエリ部分から手動でランダムな値を削除している場合:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    item_urls = hxs.select(".//a[@class='...']/@href").extract() 
    for item_url in item_urls: 
     # remove the bad part of the query part of the URL here 
     item_url = urlparse.urljoin(response.url, item_url) 
     self.log('Found item URL: %s' % item_url) 
     yield Request(item_url, callback = self.parse_item) 
10

許可された引数のリストのみを保持するURLをきれいにする(scrapy自体によって使用されます)。

関連する問題