昨天在爬取人民日报项目中,有个地方是爬取作者的名字,写了正则表达式,但老是返回不了结果。今天检查了下,原来是特殊字符的原因。
网页中源代码是这样的:
我把这段代码复制出来专门测试正则:
</founder-date>
<founder-author>
施小琳
</founder-author>
<founder-title>为红土地描绘新画卷筑牢坚实道德根基(推进新时代公民道德建设)
我想用正则取出施小琳,用的以下的正则表达式:
pat = r'<founder-author>([\s\S]*?)</founder-author>'
写的代码是:
import re
txt = '''
<!--mpproperty <founder-date>
2020-09-11
</founder-date>
<founder-author>
施小琳
</founder-author>
<founder-title>为红土地描绘新画卷筑牢坚实道德根基(推进新时代公民道德建设)
'''
pat = r'<founder-author>([\s\S]*?)</founder-author>'
pat2 = r'<founder-author>\n(.*?)\n</founder-author>'
author = re.search(pat2,txt)
print(author.group(1))
输出结果:
运行:C:\Python36\python.exe 无标题3.py
施小琳
输出结束,返回值是[0].
结果前后有两个空行,于是我修改了下正则表达式:
pat2 = r'<founder-author>\n(.*?)\n</founder-author>'
输出结果:
运行:C:\Python36\python.exe 无标题3.py
施小琳
输出结束,返回值是[0].
不错没有换行,达到预想的效果,我马上把正则复制到正式程序中去测试,结果提示:
AttributeError: 'NoneType' object has no attribute 'group'
说明没有找到相关的字符,这就让我相当困惑了。还以为自己程序哪里写错了,于是我加了
print(repr(get_html(url)))
来查看原始字符串:
\r\n<founder-author>\r\n施小琳\r\n</founder-author>\r\n
原来原始的html里还有一个 \r ,我在写正则时没有考虑这个,所以匹配不出来,然而我前面复制出来单独写正则时却匹配出来了,这是因为在可能在复制文本时,文本编辑器把默认的\r给去掉了,所以才造成两边的差异。
总结:一些字符串里常常含有一些不可见字符,在用正则匹配时要注意。解决办法:用repr函数输出原始字符串。