【问题标题】:Normalize whitespace with Python使用 Python 规范化空格
【发布时间】:2018-03-12 02:16:37
【问题描述】:

我正在使用scrapy 构建数据提取,并希望规范化从 HTML 文档中提取的原始字符串。这是一个示例字符串:

  Sapphire RX460 OC  2/4GB

请注意字符串文字前面和OC2 之间的两组两个空格。

Python 提供了 How do I trim whitespace with Python? 中所述的修剪,但这不会处理 OC2 之间的两个空格,我需要将它们折叠成一个空格。

我尝试使用 XPath 中的 normalize-space(),同时使用我的 scrapy Selector 提取数据,这可行,但分配冗长且向右漂移强烈:

product_title = product.css('h3').xpath('normalize-space((text()))').extract_first()

有没有一种优雅的方式来使用 Python 规范化空格?如果不是单行,有没有办法可以将上面的行分解成更易于阅读的内容而不会引发缩进错误,例如

product_title = product.css('h3')
    .xpath('normalize-space((text()))')
    .extract_first()

【问题讨论】:

    标签: python string xpath scrapy


    【解决方案1】:

    你可以使用:

    " ".join(s.split())
    

    s 是你的字符串。

    【讨论】:

      【解决方案2】:

      与其使用正则表达式,更有效的解决方案是使用 join/split 选项,请注意:

      >>> timeit.Timer((lambda:' '.join(' Sapphire RX460 OC  2/4GB'.split()))).timeit()
      0.7263979911804199
      
      >>> def f():
              return re.sub(" +", ' ', "  Sapphire RX460 OC  2/4GB").split()
      
      >>> timeit.Timer(f).timeit()
      4.163465976715088
      

      【讨论】:

      • 随着我的提取物的大小增加,我会回过头来回答这个问题。谢谢!!
      • 快乐是我的全部。
      【解决方案3】:

      您可以使用下面的函数和正则表达式来扫描连续的空格并将它们替换为 1 个空格

      import re
      
      def clean_data(data):
          return re.sub(" {2,}", " ", data.strip())
      
      product_title = clean(product.css('h3::text').extract_first())
      

      然后随心所欲地改进清洁功能

      【讨论】:

      • 不像我想要的那样优雅,但可扩展性很重要。
      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 2017-08-30
      相关资源
      最近更新 更多