使用刮伤外壳时:
scrapy shell “http://blogs.reuters.com/us/“并试图提取网址的标题:
response.xpath('(//title/text())').extract()我得到:
[u’Analysis & Opinion | Reuters']当我运行我的爬虫时,我在postgresql数据库中得到以下信息:
{“Analysis & Opinion | Reuters”}我想要的是:
Analysis & Opinion | Reuters我怎样才能做到这一点?此外,这是我正在使用的管道,如果这有帮助的话:
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from targets.items import TargetsItem
class MySpider(CrawlSpider):
name = 'reuters'
allowed_domains = ['blogs.reuters.com']
start_urls = [
'http://blogs.reuters.com/us/'
]
rules = (
Rule(LinkExtractor(allow_domains=('blogs.reuters.com', )), callback='parse_item'),
)
def parse_item(self, response):
item = TargetsItem()
item['title'] = response.xpath('(//title/text())').extract()
item['link'] = response.url
return item发布于 2014-10-27 20:30:13
最好的选择是使用物品装载机和输入输出处理器
物品装载机提供了一种方便的机制来填充刮过的物品。尽管可以使用自己的字典类API来填充项,但Item Loader提供了一个更方便的API,用于从刮取过程中填充它们,方法是在分配原始提取的数据之前自动执行一些常见任务,例如解析原始提取的数据。
特别是TakeFirst()处理器。定义您的加载程序:
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose
class TargetLoader(ItemLoader):
default_output_processor = TakeFirst()并使用加载程序加载项目:
def parse_item(self, response):
l = TargetLoader(TargetsItem(), response)
l.add_xpath('title', '//title/text()')
l.add_value('link', response.url)
return l.load_item()演示:
$ scrapy shell http://blogs.reuters.com
>>> import scrapy
>>> from scrapy.contrib.loader import ItemLoader
>>> from scrapy.contrib.loader.processor import TakeFirst, MapCompose
>>> class TargetItem(scrapy.Item):
... title = scrapy.Field()
... link = scrapy.Field()
...
>>> class TargetLoader(ItemLoader):
... default_output_processor = TakeFirst()
...
>>> l = TargetLoader(TargetItem(), response)
>>> l.add_xpath('title', '//title/text()')
>>> l.add_value('link', response.url)
>>> l.load_item()
{'link': 'http://blogs.reuters.com/us/',
'title': u'Analysis & Opinion | Reuters'}发布于 2014-10-27 20:29:59
[u’Analysis & Opinion | Reuters']是包含'Analysis & Opinion | Reuters'字符串的Python的文本表示形式。替换
item['title'] = response.xpath('(//title/text())').extract()使用
item['title'] = response.xpath('(//title/text())').extract()[0]而且您应该很好(当然,只要response.xpath('(//title/text())').extract()返回长度为>= 1的列表)。
https://stackoverflow.com/questions/26596197
复制相似问题