求助 一个python正则表达式,请大家指导

赵蕾 2013-11-07 09:27:39
最近在做一爬虫程序,去网页上提取特定信息。获得包含所需信息的网页源代码如下:
<title>个人资料_******(佳缘ID:*******)的个人空间_世纪佳缘交友网</title>
***部分是我需要提取的用户信息,我写的正则表达式如下:
<title>个人资料_(?P<user>.+?)\s*?\((?P<ID>.+?)\)\s*?的个人空间_世纪佳缘交友网</title>
结果提取出来的信息为None,请各位大神不吝赐教,小女子不胜感激!
...全文
257 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 8 楼 snmr_com 的回复:
那就贴你的代码出来看看,估计没有用raw
# -*- coding: cp936 -*- #---------------------------------import--------------------------------------- import urllib2; import re; #------------------------------------------------------------------------------ def main(): userMainUrl = "http://www.jiayuan.com/24787657?fxly=pmtq-ss-210&pv.mark=s_p_c|24787657|100932951"; req = urllib2.Request(userMainUrl); resp = urllib2.urlopen(req); respHtml = resp.read(); founduser = re.search('<title>个人资料_(?P<user>.+?)\s*?((?P<ID>.+?))\s*?的个人空间_世纪佳缘交友网</title>', respHtml); print "founduser=",founduser; if(founduser): user = founduser.group(user); ID = founduser.group(ID); print "user=",user; print ID ############################################################################### if __name__=="__main__": main();
ImN1 2013-11-08
  • 打赏
  • 举报
回复
那就贴你的代码出来看看,估计没有用raw
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 6 楼 snmr_com 的回复:
[quote=引用 5 楼 zhao708981169 的回复:] [quote=引用 1 楼 Vegertar 的回复:] 不匹配只是因为原始串用的是全角括号
改成了这样 还是匹配不出来 <title>个人资料_(?P<user>.+?)\s*?\((?P<ID>.+?)\)\s*?的个人空间_世纪佳缘交友网</title>[/quote] 全角括号前面就不需要转义符了[/quote] 去掉转义符还是不对。。。
ImN1 2013-11-08
  • 打赏
  • 举报
回复
引用 5 楼 zhao708981169 的回复:
[quote=引用 1 楼 Vegertar 的回复:] 不匹配只是因为原始串用的是全角括号
改成了这样 还是匹配不出来 <title>个人资料_(?P<user>.+?)\s*?\((?P<ID>.+?)\)\s*?的个人空间_世纪佳缘交友网</title>[/quote] 全角括号前面就不需要转义符了
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 1 楼 Vegertar 的回复:
不匹配只是因为原始串用的是全角括号
改成了这样 还是匹配不出来 <title>个人资料_(?P<user>.+?)\s*?\((?P<ID>.+?)\)\s*?的个人空间_世纪佳缘交友网</title>
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 1 楼 Vegertar 的回复:
不匹配只是因为原始串用的是全角括号
嗯,有道理。但是把ID分组外面的两个( )改成了中文的()也还是匹配不出来啊,不是这样改的吗?
iasky 2013-11-08
  • 打赏
  • 举报
回复
嗯,有中文,是大写的括号
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 15 楼 snmr_com 的回复:

>>> m = re.search(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')
'Malcolm'
>>> m.group('last_name')
'Reynolds'
>>> m.groupdict()
{'first_name': 'Malcolm', 'last_name': 'Reynolds'}
知道了,我写的group括号里忘了加引号
ImN1 2013-11-08
  • 打赏
  • 举报
回复

>>> m = re.search(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')
'Malcolm'
>>> m.group('last_name')
'Reynolds'
>>> m.groupdict()
{'first_name': 'Malcolm', 'last_name': 'Reynolds'}
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 10 楼 snmr_com 的回复:
你看看手册吧 re.search的结果要用group/groups/groupdict提取的,直接赋值就是None,不管有没匹配 一两句说不明白,你认真看看手册的例子 或者改成findall,但findall的话返回没有key的,只按顺序组成元祖 另外要写成 re.search(r'<title>…… 这样的raw方式 不然那些\s \t之类都被转义了,不是原来的正则了
又试了一下,发现问题出在两个地方:一是python脚本默认的编码方式是ascii,包含中文时需要用# -*- coding: utf-8 -*-来进行编码声明;二是re.search这个函数,把正则表达式中对子表达组的命名去掉,提取时直接用组号1,2来提取。这个地方还是不太明白为什么,会去好好看看手册的。多谢啦!
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 11 楼 angel_su 的回复:
注意编码也要一致,譬如你的脚本是gbk的,网页utf-8,那中文打死也匹配不上...
嗯嗯,多谢多谢
赵蕾 2013-11-08
  • 打赏
  • 举报
回复
引用 10 楼 snmr_com 的回复:
你看看手册吧 re.search的结果要用group/groups/groupdict提取的,直接赋值就是None,不管有没匹配 一两句说不明白,你认真看看手册的例子 或者改成findall,但findall的话返回没有key的,只按顺序组成元祖 另外要写成 re.search(r'<title>…… 这样的raw方式 不然那些\s \t之类都被转义了,不是原来的正则了
写成raw方式果然好了,膜拜~~~~
angel_su 2013-11-08
  • 打赏
  • 举报
回复
注意编码也要一致,譬如你的脚本是gbk的,网页utf-8,那中文打死也匹配不上...
ImN1 2013-11-08
  • 打赏
  • 举报
回复
你看看手册吧 re.search的结果要用group/groups/groupdict提取的,直接赋值就是None,不管有没匹配 一两句说不明白,你认真看看手册的例子 或者改成findall,但findall的话返回没有key的,只按顺序组成元祖 另外要写成 re.search(r'<title>…… 这样的raw方式 不然那些\s \t之类都被转义了,不是原来的正则了
ImN1 2013-11-08
  • 打赏
  • 举报
回复
引用 1 楼 Vegertar 的回复:
不匹配只是因为原始串用的是全角括号
+1
Vegertar 2013-11-07
  • 打赏
  • 举报
回复
不匹配只是因为原始串用的是全角括号

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧