2014-11-28 6 views
2

Я пытаюсь закодировать скребок с помощью Scrapy для Python. На этом этапе я пытаюсь получить имя веб-страницы и всех исходящих ссылок внутри страницы. Вывод должен быть словарем как этотКак перебрать элемент ответа в Scrapy?

 {'link': [u'Link1'], 'title': [u'Page title']} 

Я создал этот код:

from scrapy.spider import Spider 
from scrapy import Selector 
from socialmedia.items import SocialMediaItem 

class MySpider(Spider): 
    name = 'smm' 
    allowed_domains = ['*'] 
    start_urls = ['http://en.wikipedia.org/wiki/Social_media'] 
    def parse(self, response): 
     items =[] 
     for link in response.xpath("//a"): 
      item = SocialMediaItem() 
      item['title'] = link.xpath('text()').extract() 
      item['link'] = link.xpath('@href').extract() 
      items.append(item) 
      yield items 

Может кто-нибудь помочь мне, чтобы получить этот результат? Я скорректировал код с этой страницы http://mherman.org/blog/2012/11/05/scraping-web-pages-with-scrapy/

обновление кода без устаревших функций. Большое вам спасибо!

Дани

ответ

2

Если я правильно понимаю, вы хотите перебрать все ссылки и вытяжных ссылок и заголовков.

Получить все a теги через //a XPath и извлекать text() и @href:

def parse(self, response): 
    for link in response.xpath("//a"): 
     item = SocialMediaItem() 
     item['title'] = link.xpath('text()').extract() 
     item['link'] = link.xpath('@href').extract() 
     yield item 

Это дает:

{'link': [u'#mw-navigation'], 'title': [u'navigation']} 
{'link': [u'#p-search'], 'title': [u'search']} 
... 
{'link': [u'/wiki/Internet_forum'], 'title': [u'Internet forums']} 
... 

Кроме того, обратите внимание, что есть Link Extractors встроенный в Scrapy:

LinkExtractors are objects whose only purpose is to extract links from web pages (scrapy.http.Response objects) which will be eventually followed.

+0

Спасибо alecxe. Я получаю эту ошибку, когда я использую «yield» 2014-11-28 18: 31: 30 + 0100 [smm] ОШИБКА: Паук должен вернуть Request, BaseItem или None, получил «список» в . При использовании «return» он не дает никаких ошибок, но ничего не сохраняет в файле. Как бы вы использовали средство выделения ссылок? Я обновил код. –

+0

@ DaniValverde, пожалуйста, используйте точный метод 'parse(), который я предоставил, - не приведет к ошибке. – alecxe

+0

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

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