我正在尝试从"pixiv“网站上获取作者信息。以下是来自网站的代码:
<meta property="og:title" content="ラララ | かるは [pixiv]">我想要得到"かるは“,我使用正则表达式:
[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])然而,在Python中,我无法获得任何返回值。(P.S. websiteCode是网站的源代码,我试过把它打印出来,它是正确的。具体地说,有
<meta property="og:title" content="ラララ | かるは [pixiv]">内部):
以下是我的Python代码:
authorPattern = re.compile(r'[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])')
tempAuthor = re.search(authorPattern, websiteCode)
print("temp: ", tempAuthor)输出为:
Traceback (most recent call last):
File "/Users/ChinYuer/Software-Engineering/Pixiv-Spider/pixiv.py", line 191, in <module>
my.grab_image()
File "/Users/ChinYuer/Software-Engineering/Pixiv-Spider/pixiv.py", line 84, in grab_image
testAuthor = tempAuthor.group()
AttributeError: 'NoneType' object has no attribute 'group'我在一些测试网站上测试了我的正则表达式代码,它工作得很好。
这真的很令人沮丧,如果有人能帮助我,我将非常感激。
再次感谢!
发布于 2015-07-09 12:39:20
假设您的代码是为Python3编写的,它可以在Python3.3和更高版本中正常工作,但在Python3.2.x和更低版本中会失败,并显示相同的错误消息。
解决方案
最简单的解决方案是在Python3.3或更高版本中运行您的代码,并添加一个version guard以防止较低版本的Python运行您的代码。
第二种解决方案是使用常规Unicode字符串文字,其中识别和处理Unicode转义序列。这种方法的缺点是,您必须注意转义序列,并在必要时将\加倍,特别是在\b的情况下,它在到达re.compile之前被解释为常规Unicode字符串文字中的退格字符。
# Python 3.2.5 (default, Jul 25 2014, 14:13:17)
>>> print('[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])')
[ࠀ-龥_a-zA-Z0-9_]+(?=\s\[pixiv\])
>>> import re
>>> re.compile('[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])', re.DEBUG)
max_repeat 1 4294967295
in
range (2048, 40869)
literal 95
range (97, 122)
range (65, 90)
range (48, 57)
literal 95
assert 1
in
category category_space
literal 91
literal 112
literal 105
literal 120
literal 105
literal 118
literal 93
<_sre.SRE_Pattern object at 0x6001fad70>顺便说一句,您可能需要检查字符范围\u0800-\u9fa5,因为它也与Arabic, Devanagari, Thai, Lao, Box Drawing, Symbols etc.匹配
解释
原始Unicode字符串中的Unicode转义序列\u和\U
在Python3中,Unicode转义序列\u和\U在原始Unicode字符串中没有特殊处理,如Python 3.0中所指定的。Python 3.3中对字符串文字的规范进行了更新,增加了u前缀,以便于Python2代码的维护,但它是doesn't change the parsing behavior for raw Unicode string
# Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
>>> r'[\u8000]'
'[\\u8000]'
>>> '[\u8000]'
'[耀]'这与Python 2形成对比,在Python 2中,Unicode转义序列被处理为相应的Unicode字符,即使在原始Unicode字符串文字中也是如此:
# Python 2.7.8 (default, Jul 25 2014, 14:04:36)
>>> print(u'\u8000')
耀
>>> print(ur'\u8000')
耀因此,问题中包含正则表达式的字符串,如Python 3中的正则表达式引擎所示:
>>> print(r'[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])')
[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])在re包中支持Unicode转义序列\u和\U
在Python3.3之前,re包不支持\u和\U Unicode转义序列,如Python 3.2文档所示。因此,\u和\U被解释为匹配文字u和U。
添加re.DEBUG标志,您可以看到编译后的正则表达式的结果结构。为了清楚起见,我注释了输出的一部分:
# Python 3.2.5 (default, Jul 25 2014, 14:13:17)
>>> import re
>>> re.compile(r'[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])', re.DEBUG)
max_repeat 1 4294967295
in
literal 117 # u (\u)
literal 48 # 0
literal 56 # 8
literal 48 # 0
range (48, 117) # 0-u (0-\u)
literal 57 # 9
literal 102 # f
literal 97 # a
literal 53 # 5
literal 95
range (97, 122)
range (65, 90)
range (48, 57)
literal 95
assert 1
in
category category_space
literal 91
literal 112
literal 105
literal 120
literal 105
literal 118
literal 93
<_sre.SRE_Pattern object at 0x600178850>Python 3.3最终在re包中增加了对Unicode转义序列的支持,所以后续版本可以正常工作:
# Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
>>> re.compile(r'[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])', re.DEBUG);
max_repeat 1 2147483647
in
range (2048, 40869) # \u0800-\u9fa5
literal 95
range (97, 122)
range (65, 90)
range (48, 57)
literal 95
assert 1
in
category category_space
literal 91
literal 112
literal 105
literal 120
literal 105
literal 118
literal 93发布于 2015-07-09 11:44:26
原始代码在Python3中运行正常,但在Python2中需要u字符串前缀:
import re
websiteCode = u'<meta property="og:title" content="ラララ | かるは [pixiv]">'
authorPattern = re.compile(ur'[\u0800-\u9fa5_a-zA-Z0-9_]+(?=\s\[pixiv\])')
tempAuthor = re.search(authorPattern, websiteCode)
print(u"temp: " + tempAuthor.group(0))https://stackoverflow.com/questions/31307373
复制相似问题