scrapy 使用Python规范化空白

dhxwm5r4  于 2023-08-05  发布在  Python
关注(0)|答案(4)|浏览(151)

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

Sapphire RX460 OC  2/4GB

字符串
请注意,在字符串文字之前的OC2之间有两组空格,每组两个。
Python提供了How do I trim whitespace with Python?中描述的trim,但这不会处理OC2之间的两个空格,我需要将它们折叠成一个空格。
我试过在使用scrapy Selector提取数据时使用XPath中的normalize-space(),这是可行的,但赋值很冗长,而且向右偏移很大:

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


有没有一种优雅的方法可以使用Python规范化空白?如果不是一行代码,有没有一种方法可以将上面的行拆分成更容易阅读的内容,而不会引发缩进错误,例如:

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

h9a6wy2h

h9a6wy2h1#

您可以用途:

" ".join(s.split())

字符串
其中s是字符串。

dwbf0jvd

dwbf0jvd2#

与其使用正则表达式,更有效的解决方案是使用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

字符串

30byixjq

30byixjq3#

公认的答案是规范化空格的正确方法。这是对您关于格式的第二个问题的回答。
您还询问了如何跨多行格式化Python代码而不抛出缩进错误。你可以在Python中使用圆括号来实现这一点。下面是你的问题中的示例代码,为了可读性,它被格式化成几行。

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

字符串
请注意,这些括号并不创建元组,因为没有逗号。外圆括号仅用于格式化目的。
上面的多行代码完全等同于将所有方法调用链接在一行上。

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

r1zhe5dt

r1zhe5dt4#

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

import re

def clean_data(data):
    return re.sub(" {2,}", " ", data.strip())

product_title = clean(product.css('h3::text').extract_first())

字符串
然后改善清洁功能反正你喜欢它

相关问题