2011-12-19 9 views
9

मैं एक ऐसी साइट को क्रॉल करने के लिए स्केपर का उपयोग कर रहा हूं जो प्रत्येक यूआरएल के अंत में क्वेरी स्ट्रिंग में यादृच्छिक मान जोड़ रहा है। यह क्रॉल को एक अनंत लूप के रूप में बदल रहा है।मैं यूआरएल से एक क्वेरी कैसे हटा सकता हूं?

मैं यूआरएल के क्वेरी स्ट्रिंग भाग को अनदेखा करने के लिए स्केपर कैसे बना सकता हूं?

उत्तर

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 

उदाहरण आउटपुट:

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

क्या यह होना चाहिए: 'urllib.parse आयात urlparse' से? –

+0

@RyanCady yes 'urllib.parse आयात urlparse' से मेरे लिए काम किया। – nipunasudha

6

कुछ कोड प्रदान करें, इसलिए हम आपकी मदद कर सकते हैं।

आप SgmlLinkExtractor साथ CrawlSpider और Rule के प्रयोग कर रहे हैं, 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

पहले और दूसरे उत्तरदायी दोनों मेरी समस्या को हल करने लगते हैं। मुझे यकीन नहीं है कि मैं दोनों उत्तरों को कैसे चिह्नित कर सकता हूं सही हैं –

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

वहाँ w3lib.url मॉड्यूल में एक समारोह url_query_cleaner है (जो खुद scrapy द्वारा प्रयुक्त) केवल अनुमति तर्कों की सूची रखने यूआरएल साफ करने के लिए।