【问题标题】:Arranging properly the results of two for loops正确安排两个 for 循环的结果
【发布时间】:2018-10-23 02:27:31
【问题描述】:

正如您从下面的代码中看到的那样,我正在使用 Scrapy 抓取一些信息。一切正常,我只是对抓取数据的存储方式不满意。使用当前代码,我得到的结果是“X”列和“Y”列并排(这很好),但是“U”的结果显示为一行,因为它是从第二个运行的环形。所以我想要的是将抓取的数据并排放在三列中:X / Y / U。有人可以帮忙吗?提前致谢!

def parse(self, response):
    U = []
    for l in response.css('div.property-info-wrapper'):
        yield {
            'X': l.css('span.info-price::text').extract_first(),
            'Y': l.css('li::text').extract_first(),
        }

    for i in response.selector.xpath('//div[@class="property-info-location ellipsis-element-control"]/text()').extract():
        U.append(i)
    yield {'U':U}

【问题讨论】:

  • 你能发布一个包含所有需要项目的最小且可测试的 html 片段吗?
  • 您好,问题已解决,但感谢您的帮助!

标签: python python-3.x for-loop scrapy yield


【解决方案1】:

您可以使用itertools.zip_longest 将两个结果压缩在一起,并根据它们的真值产生它们*

from itertools import zip_longest

def parse(self, response):
    locations = response.selector.xpath('//div[@class="property-info-location ellipsis-element-control"]/text()').extract()
    css = response.css('div.property-info-wrapper')

    for loc, c in zip_longest(css, locations):
        if loc:
            yield {
                'X': loc.css('span.info-price::text').extract_first(),
                'Y': loc.css('li::text').extract_first(),
            }
        if c:
            yield {'U': c}  # since spider needs to return dict

* itertools.zip_longest(*iterables, fillvalue=None): 创建一个迭代器,聚合来自每个可迭代对象的元素。如果可迭代的长度不均匀,则用 fillvalue 填充缺失值。迭代一直持续到最长的可迭代对象用完为止。

【讨论】:

  • 您好,谢谢您的回答。我在初始代码中犯了一个小错误,“位置”本来是“U”。不知道这是否对您的回答有任何影响。
  • @fg42 是的,我猜到了。我没有任何区别。
  • 我从 scrapy 收到此错误:“Spider 必须返回 Request、BaseItem、dict 或 None,得到 'str'”。但是 X 和 Y 被正确刮掉了。
  • @fg42 我想那是因为yield c你可以把它改成{'U': c}或者smth。
  • 好的,它确实有效。奇怪的是,我得到了很多空白单元格,但我可以轻松地将它们删除,所以这不是一个真正的问题,因为所有数据都被刮掉了。非常感谢!
猜你喜欢
  • 2012-01-16
  • 2021-12-18
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多