2016-12-14 2 views
3

У меня есть список адресов следующим образом:Strip случайных символов из URL

urls = [ 
www.example.com?search?q=Term&page=0, 
www.example.com?search?q=Term&page=1, 
www.example.com?search?q=Term&page=2 
] 

Где срок может быть любой термин, который мы хотим: Europe, London и т.д ..

Моя часть кода (в том числе весь код) состоит в следующем:

for url in urls: 
    file_name = url.replace('http://www.example.com/search?q=','').replace('=','').replace('&','') 
    file_name = file_name+('.html') 

что приводит:

Termpage0.html 
Termpage1.html 
and so on.. 

Как я могу лишить срок в списке адресов, чтобы привести как:

page0.html 
page1.html 
and so on? 

ответ

0

Продолжайте то, что вы делаете, и использовать str.replace

for url in urls: 
    file_name = url.replace('http://www.example.com/search?q=','').replace('=','').replace('&','').replace('Term', '') 
    file_name = file_name+('.html') 

Пример:

>>> urls = ['www.example.com/search?q=Term&page=0', 'www.example.com/search?q=Term&page=1', 'www.example.com/search?q=Term&page=2'] 
>>> for url in urls: 
... file_name = url.replace('www.example.com/search?q=','').replace('=','').replace('&','').replace('Term', '') 
... file_name = file_name+('.html') 
... print (file_name) 
page0.html 
page1.html 
page2.html 

Если условия являются случайными, используйте re.sub следующим образом:

re.sub('Term|Term1|Term2', '', file_name) 

Или это, если этот термин не известен до выполнения программы:

pattern = re.compile("|".join(map(str.strip, sys.stdin.readlines()))) 
pattern.sub('', file_name) 

Пример:

>>> for url in urls: 
... file_name = url.replace('www.example.com/search?q=','').replace('=','').replace('&','') 
... file_name = re.sub('Term|Term1|Term2', '', file_name) 
... file_name = file_name+('.html') 
... print file_name 
... 
page0.html 
page1.html 
page2.html 
+0

Термин случайный. Не может быть Термином всегда. ;) –

+0

+1 за re.sub, потому что я этого не знал. Тем не менее, термин не жестко закодирован, так как я предполагаю, что вы неправильно поняли вопрос. Моя программа запрашивает у пользователя «Термин», который может быть тем, что мы хотим, и началом результатов поиска (от 0 до n). Затем я сохраняю все html-файлы на диске. –

2

Если вы просто хотите последнюю часть после последнего &, это easy:

url.split('&')[-1].replace('=', '') + '.html' 
+0

Спасибо, все. Но что мы должны делать, когда это не последнее, а где-то между большим URL-адресом, и мы хотим только изменить этот случайный термин? –

5

Вы можете использовать urllib.parse, чтобы проанализировать URL-адрес, а затем часть запроса. Преимущество этого подхода состоит в том, что он будет работать так же, если порядок частей запроса изменяется или новые части добавляются:

from urllib import parse 

urls = [ 
    'www.example.com?search?q=Term&page=0', 
    'www.example.com?search?q=Term&page=1', 
    'www.example.com?search?q=Term&page=2' 
] 

for url in urls: 
    parts = parse.urlparse(url) 
    query = parse.parse_qs(parts.query) 
    print('page{}.html'.format(query['page'][0])) 

Выход:

page0.html 
page1.html 
page2.html 

В вышеуказанных urlparse возвращают ParseResult объекта, который содержит компоненты URL :

>>> from urllib import parse 
>>> parts = parse.urlparse('www.example.com/search?q=Term&page=0') 
>>> parts 
ParseResult(scheme='', netloc='', path='www.example.com/search', params='', query='q=Term&page=0', fragment='') 

Тогда parse_qs вернется dict параметров запроса, где значения являются списки:

>>> query = parse.parse_qs(parts.query) 
>>> query 
{'page': ['0'], 'q': ['Term']} 
+0

Спасибо за ваш ответ. Тем не менее, мне немного сложно понять, как работает ваш код. Вы жестко задаете URL-адрес после parse.urlparse? Кроме того, на какой запрос запрашивается (строка 4)? –

+0

@ URL-адрес YannisDran не обязательно должен быть жестко запрограммирован, я изменил ответ, чтобы проиллюстрировать это. 'query' в строке 4 - это словарь, где ключи являются полями запроса (' 'page'' &' 'q''), а значения - это списки значений запроса (' ['0'] '&' ['Term'] ' соответственно). – niemmi