如何在Scrapy中循环响应元素?

时间:2014-11-28 16:10:29

标签: python web-scraping scrapy scraper

我正在尝试使用Scrapy for Python编写一个刮刀。此时,我正在尝试获取网页的名称以及页面中的所有出站链接。输出应该是这样的字典

        {'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/

在没有弃用功能的情况下更新代码。 非常感谢你!

达尼

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望迭代所有链接并提取链接和标题。

通过a xpath获取所有//a代码,然后提取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']}
...

另外,请注意Scrapy内置了Link Extractors

  

LinkExtractors是唯一目的是从中提取链接的对象   网页(scrapy.http.Response对象)将最终   接着