2016-01-18 5 views
1

Я использую Scrapy, чтобы очистить эту страницу:Получить ссылки форму википедии

https://en.wikipedia.org/wiki/List_of_shopping_malls_in_the_United_States

ссылкам находятся в:

data = response.xpath('//*[@id="mw-content-text"]/ul[9]/li').extract() 

где данные:

[<Selector xpath='//*/li' data=u'<li><a href="/wiki/Ala_Moana_Center" tit'>, 
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Kahala_Mall" title="K'>, 
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Pearlridge" title="Pe'>, 
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Prince_Kuhio_Plaza" t'>, 
<Selector xpath='//*/li' data=u'<li><a href="/wiki/Victoria_Ward_Centers'>] 

ссылки Мне нужны:

https://en.wikipedia.org + HREF

, например:

'https://en.wikipedia.org' + '/ вики/Ala_Moana_Center'

для этого я использую регулярное выражение

link = 'https://en.wikipedia.org' + re.findall('href="([^"]+)',str(data[0]))[0] 

name = re.findall('href="([^"]+)',str(data[0]))[0].replace('/wiki/','').replace('_',' ') 

Вопрос в том, что с этим подход. Мне нужно будет создать петли, чтобы получить ссылки, есть способ создать эти ссылки, которые непосредственно формируют scrapy или по крайней мере эффективнее?

ответ

2

Но, нет необходимости в регулярных выражения, укажите ваш XPath непосредственно к href атрибутам:

data = response.xpath('//*[@id="mw-content-text"]/ul[9]/li/a/@href').extract() 

Затем используйте urlparse.urljoin() построить абсолютные URL, используя response.url в качестве базы:

from urlparse import urljoin 

base_url = response.url 
data = [urljoin(base_url, link) 
     for link in response.xpath('//*[@id="mw-content-text"]/ul[9]/li/a/@href').extract()] 

В качестве побочного примечания мне не особенно нравится часть ul[9] в выражении XPath - использование индексов не является, вообще говоря, reli и может легко сломаться - и вы не можете читать и понимать выражение. Похоже, вы ищете гавайские торговые центры. Найдите ссылки, основанные на предыдущем Hawaii этикетке:

//a[. = "Hawaii"]/following::ul/li/a/@href 

С помощью этого выражения легко увидеть, что вы на самом деле определения местоположения.


Вот как вы можете сгруппировать ссылки по штатам, например, от Shell:

$ scrapy shell https://en.wikipedia.org/wiki/List_of_shopping_malls_in_the_United_States 
>>> from urlparse import urljoin 
>>> from pprint import pprint 
>>> 
>>> base_url = response.url 
>>> 
>>> data = {} 
>>> for state in response.xpath("//h3[span[@class='mw-headline']]"): 
...  state_name = state.xpath(".//a[@title]/text()").extract_first() 
...  links = [urljoin(base_url, link) for link in state.xpath('./following-sibling::*[1]//li/a/@href').extract()] 
...  data[state_name] = links 
>>> 
>>> pprint(data) 
+0

Спасибо, ну на самом деле мне нужно все ссылки. Я предпочел бы иметь ссылки по штату, я не нашел шаблон, чтобы связать ссылки с состояниями, не предварительно указав имена состояний, находящихся на странице. Так я попробую с: response.xpath ('// * [@ ID = "МВТ-контент-текст"]/мкл/li') экстракт() –

+0

@LuisRamonRamirezRodriguez уверен, позвольте мне помочь вам. группируя ссылки по штату, дай мне минуту. – alecxe

+0

@LuisRamonRamirezRodriguez okay, обновленный с образцом, попробуйте и попробуйте проверить, если он обрабатывает ситуации, когда нет связей для состояния. Благодарю. – alecxe

Смежные вопросы