2016-05-16 56 views
2

我试图在scrapy中学习物料装载机,下面的代码工作不正常:它给我提供了“start_url”值而不是“SUBJECT”和“CREATOR2”值(他们根本没有出现,不仅有空插槽)。我无法弄清楚它为什么这样做。项目装载机在scrapy中无法正常工作

我需要特别为“CREATOR2”值使用Item Loaders,它有时在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() 

它们都在项目文件中命名,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() 

回答

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壳牌的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' 
+0

谢谢!但它无法正常工作。 –

+0

@LaraM。你确定XPath表达式是正确的吗?此外,发布项目和项目加载器定义。谢谢。 – alecxe

+0

添加了项目和加载程序定义。是的,我很确定,这里是一个例子的页面:view-source:http://www.aib.it/aib/sezioni/emr/bibtime/num-i-1/bucchion.htm –