2012-03-06 39 views
4

我正在使用Windows 7和scrappy交互式控制台(基于IPython)。Scrappy的方法re()不能与Unicode字符串一起工作

我做教程

一步Trying Selectors in the Shell如果我抓住一些网站以英文字母的标题,全是好的,就像在教程:

In [5]: hxs.select('//title/text()').re('(\w+):')` 
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']` 

但是,如果我抢到网站与非 - 英语字母(俄罗斯,Unicode的),重()方法不返回任何东西:

In [25]: hxs.select('//title/text()').re('(\w+)') 
Out[25]: [] 

中有标题一些文字,它不是空的:

In [24]: hxs.select('//title/text()').extract() 
Out[24]: [u'\u041b\u043e\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u043e\u0432'] 

帮帮我,我可以使用scrapy的re()与unicode符号吗?

回答

4

Scrapy的声音没有为其正则表达式使用re.UNICODE标志,因此\w不包括所有由Unicode定义的“字”字符。

该文档似乎表明Scrapy的.re可以采取已编译的正则表达式,所以你可以尝试编译你自己的正则表达式与UNICODE标志:

import re 
hxs.select('//title/text()').re(re.compile('(\w+)', re.UNICODE)) 
+0

谢谢,已经编译regeex做工精细! – 2012-03-06 03:26:36

+0

但是你有什么想法为什么re.UNICODE标志默认情况下适用于正则表达式? – 2012-03-06 03:28:04

+0

我会希望Scrapy在内部设置该标志,但是在源代码中查看[否则指示](https://github.com/scrapy/scrapy/blob/0.15.1/scrapy/utils/misc.py #L69)。 – 2012-03-06 03:38:31

相关问题