Pra*_*dra 5 python scrapy python-3.x
我正在尝试按照本教程.
我希望我的desc字段是一个标准化为单个空格的字符串,并且是大写的.
dmoz_spider.py
import scrapy
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
Run Code Online (Sandbox Code Playgroud)
我尝试根据http://doc.scrapy.org/en/latest/topics/loaders.html#declaring-input-and-output-processors声明输入/输出处理器
items.py
import scrapy
from scrapy.loader.processors import MapCompose, Join
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field(
input_processor=MapCompose(
lambda x: ' '.join(x.split()),
lambda x: x.upper()
),
output_processor=Join()
)
Run Code Online (Sandbox Code Playgroud)
但是,我的输出仍然是这样的.
{'desc': ['\r\n\t\r\n ',
' \r\n'
'\t\t\t\r\n'
' - By David Mertz; Addison Wesley. '
'Book in progress, full text, ASCII format. Asks for feedback. '
'[author website, Gnosis Software, Inc.]\r\n'
' \r\n'
' ',
'\r\n '],
'link': ['http://gnosis.cx/TPiP/'],
'title': ['Text Processing in Python']}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我正在使用Python 3.5.1和Scrapy 1.1.0
我在这里提出了我的整个代码:https://github.com/prashcr/scrapy_tutorial,以便您可以根据需要尝试修改它.
但是,还有一个地方可以指定要使用的输入和输出处理器:在项目字段元数据中.
我怀疑文档是误导/错误(或者可能是过时的?),因为根据源代码,input_processorfield属性只在ItemLoader实例内部读取,这意味着您无论如何都需要使用Item Loader.
您可以使用内置的,并按DmozItem原样保留定义:
from scrapy.loader import ItemLoader
class DmozSpider(scrapy.Spider):
# ...
def parse(self, response):
for sel in response.xpath('//ul/li'):
loader = ItemLoader(DmozItem(), selector=sel)
loader.add_xpath('title', 'a/text()')
loader.add_xpath('link', 'a/@href')
loader.add_xpath('desc', 'text()')
yield loader.load_item()
Run Code Online (Sandbox Code Playgroud)
这样,将考虑input_processor和output_processor项目字段参数,并应用处理器.
或者您可以在自定义Item Loader中定义处理器而不是Item类:
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
class MyItemLoader(ItemLoader):
desc_in = MapCompose(
lambda x: ' '.join(x.split()),
lambda x: x.upper()
)
desc_out = Join()
Run Code Online (Sandbox Code Playgroud)
并使用它来加载蜘蛛中的物品:
def parse(self, response):
for sel in response.xpath('//ul/li'):
loader = MyItemLoader(DmozItem(), selector=sel)
loader.add_xpath('title', 'a/text()')
loader.add_xpath('link', 'a/@href')
loader.add_xpath('desc', 'text()')
yield loader.load_item()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |