我正在使用 scrapy 构建数据提取,并希望规范化从 HTML 文档中提取的原始字符串。这是一个示例字符串:
Sapphire RX460 OC 2/4GB
注意字符串文字前面以及
OC
和 2
之间的两组空格,每组两个空格。
Python 提供了修剪,如如何使用 Python 修剪空白?但这无法处理
OC
和 2
之间的两个空格,我需要将其折叠成一个空格。
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()
您可以使用:
" ".join(s.split())
其中
s
是你的字符串。
与其使用正则表达式,更有效的解决方案是使用连接/拆分选项,观察:
>>> 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
您可以使用如下函数和正则表达式来扫描连续空格并将其替换为 1 个空格
import re
def clean_data(data):
return re.sub(" {2,}", " ", data.strip())
product_title = clean(product.css('h3::text').extract_first())
然后按照你喜欢的方式改进清洁功能
接受的答案是标准化空白的正确方法。这是关于格式化的第二个问题的答案。
您还询问了如何跨多行格式化 Python 代码而不引发缩进错误。您可以在 Python 中使用括号来做到这一点。以下是您的问题中的示例代码,为了便于阅读,将其格式化为多行。
product_title = (
product.css("h3")
.xpath("normalize-space((text()))")
.extract_first()
)
请注意,这些括号不会创建元组,因为没有逗号。外括号仅用于格式化目的。
上面的多行代码完全相当于将所有方法调用链接在一行上。
product_title = product.css("h3").xpath("normalize-space((text()))").extract_first()