【问题标题】:Scrapy: Modifying elements and fields in a responseScrapy:修改响应中的元素和字段
【发布时间】:2015-10-08 18:01:10
【问题描述】:

我对 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

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

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

谢谢。

【问题讨论】:

  • 请阅读scrapy pipelines 的文档并尝试更具体地回答您的问题。见How to Ask
  • 嗨弗兰克。感谢您关注我的问题。我添加了一些示例代码,并试图使问题更加具体和清晰。一切都发生在主要的蜘蛛解析函数中(即在管道之前)。如果我仍然可以让您/其他人更清楚地了解问题,请告诉我。马库斯
  • @FrankMartin 我觉得这是一个遵循该页面上列出的所有准则的问题示例。它清晰、具体、正确标记、在语法和单词选择方面写得很好,并且来自第一次使用的用户。
  • @Borealid 恕我直言,最初的问题(请参阅编辑前的版本)不清楚和具体。但我没有否决/忽略它,而是给出了如何改进问题的建议(它通过编辑完成了)。我的评论绝不是粗鲁的,而是鼓励的。抱歉,不清楚。

标签: python python-2.7 scrapy lxml


【解决方案1】:

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

Parsel 选择器(Scrapy 在下面使用)旨在提取信息,而不是编辑底层 HTML。我相信您目前的方法是最好的方法。

如果你真的想避免重复的感觉,你可以只使用 lxml,但我强烈建议你不要这样做。

【讨论】:

    【解决方案2】:

    我很困惑,以及你想要实现的目标,你试图从选择器中修改正确吗?

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

    只看代码,您似乎正在尝试连接以编辑您的项目。

    被引用的生成器是什么,然后“编辑”最终输出正确的是什么?如果是这样,那么发生的情况是您不能隐式连接列表和字符串。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      相关资源
      最近更新 更多