Unicode空间会自动转义,不再被`strip()`识别

TLDR:Scrapy会转义Unicode空间代码\u0020,因此strip()不再识别它。

我正尝试使用Scrapy抓取一些Web链接,如下所示:

class MySpider(scrapy.Spider): 

    name = 'testSpider'
    start_urls = [<someStartUrls>]

    def parse(self,response): 
        for entry in response:
            yield {<someComplicatedXPath>.xpath('a/@href').get()} 

其中一些链接具有怪异的格式工件,例如,它们看起来像<a href="linkUrl\u0020"> Link Text </a><a href="\u0020linkUrl2"> Link Text </a>-即,它们中包含Unicode空间。这些空格保留在我的输出中:

linkUrl\u0020
\u0020linkUrl2

要至少删除这样的前导和尾随空格,我在XPath输出周围包裹了“清理”功能:

    <...>
    def parse(self,response): 
        for entry in response:
            yield {cleanStr(<someComplicatedXPath>.xpath('a/@href').get())} 

def cleanStr(webString): # a bit simplified 
    return webString.strip()

那没有任何作用。当我查看字符串的表示形式时,很清楚为什么:

def cleanStr(webString): # a bit simplified 
    print(webString)       ##### this prints "linkUrl\u0020"  #####
    print(repr(webString)) ##### this prints "linkUrl\\u0020" #####
    return webString.strip()

因此strip()接收带有转义反斜杠的字符串,并且不再识别Unicode代码。我假设这种转义发生在get()执行期间,但是我不确定。

虽然可以用蛮力代替这个前Unicode空间,但这肯定不是正确的方法。可靠地处理HTML链接内这些空间的最佳方法是什么?

anhuiaust 回答:Unicode空间会自动转义,不再被`strip()`识别

如果您有一个字符,则只需将replace()'\\u0020'或原始前缀r'\u0020'一起使用

text = r'linkUrl\u0020'
print(text)
text = text.replace(r'\u0020',' ')
print(text)

结果:

linkUrl\u0020
linkUrl 

如果您还有其他带有\u的字符,则可以使用.encode().decode('unicode_escape')

text = r'linkUrl\u0020\u0041\u0042\u0043'
print(text)
text = text.encode().decode('unicode_escape')
print(text)

结果:

linkUrl\u0020\u0041\u0042\u0043
linkUrl ABC

文档:7.2.4. Python Specific Encodings

本文链接:https://www.f2er.com/3034627.html

大家都在问