首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将刮伤爬虫结果插入postgresql时出现的卷曲括号问题

将刮伤爬虫结果插入postgresql时出现的卷曲括号问题
EN

Stack Overflow用户
提问于 2014-10-27 20:24:46
回答 2查看 529关注 0票数 0

使用刮伤外壳时:

代码语言:javascript
复制
scrapy shell “http://blogs.reuters.com/us/“

并试图提取网址的标题:

代码语言:javascript
复制
response.xpath('(//title/text())').extract()

我得到:

代码语言:javascript
复制
[u’Analysis & Opinion | Reuters']

当我运行我的爬虫时,我在postgresql数据库中得到以下信息:

代码语言:javascript
复制
{“Analysis & Opinion | Reuters”}

我想要的是:

代码语言:javascript
复制
Analysis & Opinion | Reuters

我怎样才能做到这一点?此外,这是我正在使用的管道,如果这有帮助的话:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-27 20:30:13

最好的选择是使用物品装载机输入输出处理器

物品装载机提供了一种方便的机制来填充刮过的物品。尽管可以使用自己的字典类API来填充项,但Item Loader提供了一个更方便的API,用于从刮取过程中填充它们,方法是在分配原始提取的数据之前自动执行一些常见任务,例如解析原始提取的数据。

特别是TakeFirst()处理器。定义您的加载程序:

代码语言:javascript
复制
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose

class TargetLoader(ItemLoader):
    default_output_processor = TakeFirst()

并使用加载程序加载项目:

代码语言:javascript
复制
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()

演示:

代码语言:javascript
复制
$ 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'}
票数 1
EN

Stack Overflow用户

发布于 2014-10-27 20:29:59

[u’Analysis & Opinion | Reuters']是包含'Analysis & Opinion | Reuters'字符串的Python的文本表示形式。替换

代码语言:javascript
复制
item['title'] = response.xpath('(//title/text())').extract()

使用

代码语言:javascript
复制
item['title'] = response.xpath('(//title/text())').extract()[0]

而且您应该很好(当然,只要response.xpath('(//title/text())').extract()返回长度为>= 1的列表)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26596197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档