我正在用python的一个爬虫框架写爬虫,爬虫框架自带pyquery来解析html获取想要的内容。但是在使用的过程中感觉不是太通用。有以下两点问题:
同一个网站中联系人的位置老是变动,因为前面的信息个数不一样。html结构变动后pyquery就不能正常获取想要的数据了。
有时候目标节点里还有子节点或是同节点有其它不需要的字符串,获取数据时就会多余很多不需要的字符。
基于以上需求想使用正则表达式来获取想要的内容。但是python的正则表达式对中文支持的不是太好,需要转码才能匹配,规则也不好测试。
请问python有没有封装好的正则类呢?输入包含有中文的正则表达式也能自动转码匹配的
Python 正则表达式对中文支持没有任何问题,可以在 unicode 下匹配,可以在 GBK 编码下匹配,也可以在 UTF8 编码匹配。只要正则表达式和字符串都是 unicode,或者采用相同的编码,不会有任何问题。至于比如说用 GBK 编码的正则匹配 UTF8 的字符串,无论哪个正则引擎都做不到,因为这完全不是正则的问题。
在编码问题上,正则匹配和字符串匹配的性质是一样的,如果觉得正则难以理解,可以思考一下字符串匹配。
例如,“搜索”这个词在 Python 中常见的形式有三种:
unicode 字符串
u'\u641c\u7d22'
;GBK 编码字符串
'\xcb\xd1\xcb\xf7'
;UTF8 编码字符串
'\xe6\x90\x9c\xe7\xb4\xa2'
。u'搜' in u'搜索'
在 unicode 下进行匹配,实际上就是u'\u641c' in u'\u641c\u7d22'
。'搜' in '搜索'
则有点复杂,如果在 GBK 编码的文件或终端下,等价于'\xcb\xd1' in '\xcb\xd1\xcb\xf7'
;在 UTF8 编码的文件或终端下,等价于'\xe6\x90\x9c' in '\xe6\x90\x9c\xe7\xb4\xa2'
。但以上三种情况都是True
。然而如果一个字符串是 GBK,另一个是 UTF8,相当于'\xcb\xd1' in '\xe6\x90\x9c\xe7\xb4\xa2'
,自然是False
了。但这里其实隐藏了一个陷阱,编码后的字符串长度大于 2,GBK 编码下中间两个字符
'\xd1\xcb'
其实是 GBK 编码下的“阉”字。所以可以在 GBK 编码的文件或终端下执行以下语句:如果是在 unicode 下,则“搜索”这个词的长度是 2,不会发生这种问题。所以如果先将字符串都转成 unicode 就不容易犯错。除非你对编码问题理解得足够透彻,否则不建议对编码后的字符串进行正则匹配,虽然这是完全可行的。