物品装载机在scrapy中不能正常工作

时间:2016-05-16 14:45:18

标签: python scrapy

我试图在scrapy中学习Item Loaders,下面的代码不能正常工作:它只给了我" start_url"价值而不是" SUBJECT"和" CREATOR2"价值(它们根本不出现,不只是一个空槽)。我无法弄清楚为什么会这样做。

我需要特别为" CREATOR2"使用物品装载机。值,有时在xpath上,有时在另一个上。

import scrapy
from bibtime.items import BibtimeItem, BibtimeLoader
from scrapy.loader import ItemLoader
from scrapy.contrib.loader.processor import Identity
from scrapy.selector import Selector

class bibtimeSpider(scrapy.Spider):
name = "bibtime"
allowed_domains = ['www.example.com']
start_urls = [
www.example.com
]

def parse(self, response):
    l = BibtimeLoader(item=BibtimeItem(), response=response)
    start_url = response.request.url
    l.add_xpath('CREATOR2', '//font[@size="+1"]/center//preceding-sibling::text()[normalize-space()]')
    l.add_xpath('CREATOR2', '//link[@rel="schema.DC"]//meta[@name="DC.creator"]//@content[normalize-space()]')
    l.add_value('start_url', start_url)
    l.add_xpath('SUBJECT', '//link[@rel="schema.DC"]//meta[@name="DC.subject"][1]//@content[normalize-space()]')

    return l.load_item()

它们都在items文件中命名,xpath在测试器上正常工作。

编辑:作为请求,这里是项目定义:

import scrapy
from scrapy.item import Item, Field
from scrapy.loader import ItemLoader
from scrapy.contrib.loader.processor import Identity


class BibtimeItem(Item):
    CREATOR2 = Field()
    SUBJECT = Field()
    start_url = Field()
    pass

class BibtimeLoader(ItemLoader):
    #default_input_processor = Identity()
    default_output_processor = Identity()

1 个答案:

答案 0 :(得分:3)

我会在XPath中使用|(或)。另外,使用较低的字段名称:

l.add_xpath('creator2', '//font[@size="+1"]/center//preceding-sibling::text()[normalize-space()] | //link[@rel="schema.DC"]//meta[@name="DC.creator"]//@content[normalize-space()]')

另外,如果您要检查Scrapy Shell中的XPath表达式,您会发现它们实际上没有匹配:

$ scrapy shell http://www.aib.it/aib/sezioni/emr/bibtime/num-i-1/bucchion.htm
>>> response.xpath('//font[@size="+1"]/center//preceding-sibling::text()[normalize-space()]')
[]
>>> response.xpath('//link[@rel="schema.DC"]//meta[@name="DC.creator"]//@content[normalize-space()]')
[]

我怀疑这种情况正在发生,因为Scrapylxml解析了这个特殊的非格式化HTML。你需要调整你的表达式,例如:

>>> response.xpath('//center/text()').extract_first()
u'Cinzia Bucchioni'