我试图在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()
答案 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()]')
[]
我怀疑这种情况正在发生,因为Scrapy
和lxml
解析了这个特殊的非格式化HTML。你需要调整你的表达式,例如:
>>> response.xpath('//center/text()').extract_first()
u'Cinzia Bucchioni'