问题
某天用scrapy爬数据入Mongo数据库后,业务反馈采集数据出现大量问号【?
】
对照网页和采集数据分析后,发现是前端代码中出现大量
造成的
复现
scrapy
中,response.xpath
实际上用的是parsel.Selector
,因此我们这里直接用Selector
来处理就可以了
from parsel import Selector
html = '<p>you get:"Python "</p>'
selector = Selector(text=html)
content = selector.xpath('string(.)').extract_first()
print(f'content: {content}')
print(f"content bytes: {content.encode('utf8')}")
结果
content: you get:"Python "
content bytes: b'you get:"Python\xc2\xa0"'
进一步的
>>> content # str.__repr__()
'you get:"Python\xa0"'
>>> print(content) # str.__str__()
you get:"Python "
经过parsel
库的处理,html代码解析出来的正文,会将
解析为空白字符
不过此时的空白字符,不是我们常见的空格space
(ASCII:\x20
),而是\xa0
原因
\xa0
属于 latin1(ISO/IEC_8859-1)
中的扩展字符集字符,代表空白符nbsp(non-breaking space)
ISO-8859-1编码是单字节编码,向下兼容ASCII
其编码范围是0x00-0xFF
,0x00-0x7F
之间完全和ASCII一致,0x80-0x9F
之间是控制字符,0xA0-0xFF
之间是文字符号
如果字符串中出现\xa0
,一般情况下还是直接替换比较好,因为有些数据库并不能解析ISO-8859-1,入库后可能会将\xa0
替换为?
,导致数据异常。
解决
解决的话,直接用str.replace
替换即可
>>> content.replace('\xa0', ' ')
'you get:"Python "'