我正在使用Scrapy的XPathItemLoader,但它只是api文件在项目字段中添加值,但不是更深层:(我的意思是:
def parse_item(self, response):
loader = XPathItemLoader(response=response)
loader.add_xpath('name', '//h1')
将xpath找到的值添加到Item.name
,但是如何将它们添加到Item.profile['name']
?
答案 0 :(得分:2)
XPathItemLoader.add_xpath
不支持写入嵌套字段。您应该手动构建profile
dict并通过add_value
方法编写它(如果您仍需要使用加载器)。或者,您可以编写自己的自定义加载程序。
以下是使用add_value
的示例:
from scrapy.contrib.loader import XPathItemLoader
from scrapy.item import Item, Field
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
class TestItem(Item):
others = Field()
class WikiSpider(BaseSpider):
name = "wiki"
allowed_domains = ["en.wikipedia.org"]
start_urls = ["http://en.wikipedia.org/wiki/Main_Page"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
loader = XPathItemLoader(item=TestItem(), response=response)
others = {}
crawled_items = hxs.select('//div[@id="mp-other"]/ul/li/b/a')
for item in crawled_items:
href = item.select('@href').extract()[0]
name = item.select('text()').extract()[0]
others[name] = href
loader.add_value('others', others)
return loader.load_item()
通过以下方式运行:scrapy runspider <script_name> --output test.json
。
蜘蛛从主维基百科页面收集Other areas of Wikipedia
项,并将其写入字典字段others
。
希望有所帮助。
答案 1 :(得分:0)
这是默认设置scrapy.loader.Itemloader
:
class ItemLoader(object):
default_item_class = Item
default_input_processor = Identity()
default_output_processor = Identity()
default_selector_class = Selector
当您使用add_value
add_xpath
add_css
时,输入和输出处理器为Identify()
,这意味着什么都不做。所以你可以使用add value
:
name = response.xpath('//h1/text()').extract_first()
loader.add_value('profile', {'name':name})