Как мне удалить запрос из URL? - PullRequest
10 голосов
/ 20 декабря 2011

Я использую scrapy для сканирования сайта, который добавляет случайные значения в строку запроса в конце каждого URL.Это превращает сканирование в некий бесконечный цикл.

Как сделать скрап, чтобы пренебрегать частью строки запроса URL-адресов?

Ответы [ 6 ]

22 голосов
/ 21 декабря 2011

См. 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
>>> 
10 голосов
/ 24 декабря 2011

В модуле w3lib.url (используется самой scrapy) есть функция url_query_cleaner для очистки URL-адресов с сохранением только списка разрешенных аргументов.

6 голосов
/ 20 декабря 2011

Укажите код, чтобы мы могли вам помочь.

Если вы используете CrawlSpider и Rule с SgmlLinkExtractor, предоставьте пользовательскую функцию для параметра proccess_value конструктора SgmlLinkExtractor.

См. Документацию для 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,
    )
)
4 голосов
/ 25 июня 2018

Вы можете использовать функцию urllib.parse.urlsplit() .Результатом является структурированный результат анализа , именованный кортеж с дополнительными функциями.

Используйте метод namedtuple._replace(), чтобы изменить проанализированные значения результата, затем используйте SplitResult.geturl() метод для повторного получения строки URL.

Чтобы удалить строку запроса, задайте для query значение None:

from urllib.parse import urlsplit

updated_url = urlsplit(url)._replace(query=None).geturl()

Демонстрация:

>>> from urllib.parse import urlsplit
>>> url = 'https://example.com/example/path?query_string=everything+after+the+questionmark'
>>> urlparse.urlsplit(url)._replace(query=None).geturl()
'https://example.com/example/path'

Для Python 2 та же функция доступна под именем urlparse.urlsplit() .

Вы также можете использовать функцию urllparse.parse.urlparse() ;для URL-адресов без каких-либо параметров пути результат будет таким же.Эти две функции отличаются в том, как обрабатываются параметры пути;urlparse() поддерживает только параметры пути для последнего сегмента пути, в то время как urlsplit() оставляет параметры пути на месте в пути, оставляя анализ таких параметров для другого кода.Поскольку в настоящее время параметры пути используются редко [более поздние URL RFC полностью исключили эту функцию), разница носит академический характер.urlparse() использует urlsplit() и без параметров, не добавляет ничего, кроме дополнительных издержек.Лучше просто использовать urlsplit() напрямую.

1 голос
/ 20 октября 2018

используйте этот метод для удаления строки запроса из URL

urllink="http://url.something.com/bla.html?querystring=stuff"
url_final=urllink.split('?')[0]
print(url_final)

вывод будет: http://url.something.com/bla.html

0 голосов
/ 21 декабря 2011

Если вы используете BaseSpider, перед выдачей нового запроса вручную удалите случайные значения из части URL-адреса запроса, используя urlparse :

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)
...