Scrapy:修改响应中的元素和字段

Mar*_*cus 5 python lxml scrapy python-2.7

我对Scrapy,Python和面向对象编程比较陌生,所以如果我的术语不正确或者不清楚,我会道歉.

我正在尝试编写一个蜘蛛,当它从响应中抓取项目时,也会创建一个修改版本的响应以保存到文件.例如,我正在尝试更改'src'链接以指向本地保存的已删除文件.

目前,我正在使用Scrapy的选择器抓取数据并使用lxml修改响应.但是,我想使用Scrapy的方法来代替lxml进行修改,因为使用Scrapy选择器和lxml意味着基本上将代码加倍以在响应中定位相同的元素.

我在下面添加了一些代码来说明我的观点.一切都发生在蜘蛛解析功能中.

def解析(自我,回应):

    # Scrape thumbnail URLs using Scrapy selectors
    for post in response.css('.post'): # For each post
        for thumb in post.css('.thumb'): # For each thumbnail
            item = Item() # Create an image item
            item['thumbnail_url'] = []
            item['thumbnail_savepath'] = []
            for x in thumb.xpath('img/@src').extract():
                thumbnail_url = 'https:' + x
                thumbnail_filename = re.search('.*/(.*)', thumbnail_url).group(1)
                thumbnail_savepath = 'thumbnails/' + thumbnail_filename
                item['thumbnail_url'] += [thumbnail_url]
                item['thumbnail_savepath'] += [thumbnail_savepath]

    # Make modified html using lxml
    body_lxml = lxml.html.document_fromstring(response.body)
    for thumbnail in body_lxml.xpath('//img'):
        thumbnail_src = thumbnail.get('src') # Original link address
        thumbnail_path = './thumbnails/' + basename(thumbnail_src) # New link address
        thumbnail.set('src',image_path) # Setting new link address
Run Code Online (Sandbox Code Playgroud)

如代码所示,它遍历图像以使用Scrapy选择器刮取项目,然后使用lxml第二次迭代以修改响应.我必须使用两种不同的方法来遍历相同的元素,我正试图避免.如果可能的话,我想在相同的for循环中进行抓取和修改.

我当时认为可以使用response.request()方法,但我很难理解如何在文档和在线搜索中使用它.是否有一些方法允许Scrapy修改响应中的单个元素或字段?任何帮助,将不胜感激.

谢谢.

scr*_*tso 0

我很困惑你想要实现的目标,你试图从选择器中进行修改,对吗?

我知道在回复中询问更多内容违反了溢出政策,但确实有些东西需要每周更新

仅查看代码,您似乎正在尝试连接来编辑您的项目。

所提到的两个然后“编辑”的生成器是什么最终输出正确吗?如果是这样,那么发生的情况是您无法隐式连接列表和字符串。

在此输入图像描述

在这种情况下你要做的就是剥离然后加入并设置每个值...如果你或任何人有类似的东西,请提供可能相关的任何代码的完整示例...就像在这种情况下一样整个蜘蛛代码...和管道,即使原始海报没有使用一个,如果他希望保存的话,或者我总是可以只使用写入函数