鱼C论坛

 找回密码
 立即注册
查看: 2217|回复: 10

为什么我程序里的 ( ? P<name> ) 无法用group(‘name’)调用呢?

[复制链接]
发表于 2016-5-15 13:08:49 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 宝贝归来 于 2016-5-15 13:11 编辑

在Python 正则表达式的视频里,可以用(?P:<name>)给组命名,
而且还可以用 m. group('name') 来查看组
但是我这个程序就是报错,无法调用!

这个程序是用来获取 ip 和 端口号 的,我想把正则表达式里面获取 ip 的组命名为 <ip>, 把获取端口号的组命名为 <kou> ,并在后面使用 group('ip','kou')来查看获取到的内容。

程序代码(获取ip 端口号 kou)
  1. import urllib.request
  2. import re      # 正则表达式 模块

  3. def open_url(url):  # 网页打开读取
  4.     W1 = urllib.request.Request(url)
  5.     W1.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER')
  6.     W2 = urllib.request.urlopen(W1)
  7.     W3 = W2.read().decode('utf-8')
  8.     return W3

  9. def get_ip(W3):    #  在网页找ip

  10.     p = re.compile(r'''(?P<ip>((\d?\d?\d)[.]){3}(\d?\d?\d)) # 匹配ip
  11.     ([^"]*)
  12.     (?P<kou>\d?\d?\d?\d) # 匹配端口号 kou  
  13.     ''',re.X)

  14.     m = p.findall(W3)
  15.     print(m.group('ip','kou'))


  16.         
  17. if __name__ == '__main__':
  18.     url = 'http://www.xicidaili.com/'
  19.     get_ip(open_url(url))
复制代码


报错内容
  1. >>>
  2. Traceback (most recent call last):
  3.   File "C:\Users\Administrator\Desktop\060-3-(下载IP列表-高匿).py", line 28, in <module>
  4.     get_img(open_url(url))
  5.   File "C:\Users\Administrator\Desktop\060-3-(下载IP列表-高匿).py", line 19, in get_img
  6.     print(m.group('ip','kou'))
  7. AttributeError: 'list' object has no attribute 'group'
  8. >>>
复制代码


卡在这里好久了,始终研究不出来。

希望大神能帮忙修改一下程序!

最佳答案

查看完整内容

撸主把问题想复杂了,没必要一次就找出所有要的信息, 先找出高匿的 至于2位数字与4位数字用 \d+ 就可以 默认是贪婪模式 我不是大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-15 13:08:50 | 显示全部楼层
本帖最后由 小剑剑 于 2016-5-15 23:07 编辑
宝贝归来 发表于 2016-5-15 21:36
又有了一个新问题:我只想要“高匿”的ip

目前的正则表达式是这样的

  1. import urllib.request
  2. import re      

  3. def open_url(url):  
  4.     W1 = urllib.request.Request(url)
  5.     W1.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.154 Safari/537.36 LBBROWSER')
  6.     W2 = urllib.request.urlopen(W1)
  7.     W3 = W2.read().decode('utf-8')
  8.     return W3

  9. a=open_url("http://www.xicidaili.com/")
  10. b=re.findall(r'''<td class="country"><img src="http://fs\.xicidaili\.com/images/flag/cn\.png" alt="Cn" /></td>\n.+?\n.+?\n.+?\n.+?高匿''',a)
  11. c=[]
  12. for i in b:
  13.     d=re.findall(r"\d+",i)
  14.     e=d[0]+'.'+d[1]+'.'+d[2]+'.'+d[3]+'   '+d[4]
  15.     c.append(e)



复制代码


撸主把问题想复杂了,没必要一次就找出所有要的信息,
先找出高匿的
至于2位数字与4位数字用   \d+  就可以 默认是贪婪模式
我不是大神

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
宝贝归来 + 5 + 5 + 3 感谢楼主悉心指导!O(∩_∩)O~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-15 17:11:19 | 显示全部楼层
佷明显啊,他说列表没有ground方法啊,这个ground好像是用re.search得到的匹配对象的方法吧
findall就返回一个列表,拿来ground方法呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-15 17:12:10 | 显示全部楼层
佷明显啊,他说列表没有ground方法啊,这个ground好像是用re.search得到的匹配对象的方法吧
findall就返回一个列表,拿来ground方法呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-15 19:24:56 | 显示全部楼层
小剑剑 发表于 2016-5-15 17:12
佷明显啊,他说列表没有ground方法啊,这个ground好像是用re.search得到的匹配对象的方法吧
findall就返回 ...

那 findall 就没有办法使用 命名组了么?
另外我刚刚发现,端口号 有的是 8888, 有的是 80
我用 (\d?\d?\d?\d) 遇到 8888 的时候只能匹配到一个 "8"
    用(\d?\d?\d\d) 的时候 却又只能匹配到 “88”
该如何解决呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-15 21:36:28 | 显示全部楼层
又有了一个新问题:我只想要“高匿”的ip

目前的正则表达式是这样的
  1. p = re.compile(r'''(?P<ip>(?:(?:\d?\d?\d)[.]){3}(?:\d?\d?\d)) # 匹配ip
  2. (?:[^"]*)
  3. (?P<kou>(?:\d\d\d\d)) # 匹配端口号 kou
  4.                                   # 只匹配含有“高匿”项的ip
  5. ''',re.X|re.S)
复制代码


网页审查代码
  1. <tr class="odd">
  2.     <td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn"></td>
  3.     <td>218.59.114.164</td>
  4.     <td>8118</td>
  5.     <td>山东烟台</td>
  6.     <td class="country">高匿</td>     # 不同类型的ip (有“高匿”的,也有“透明”的)
  7.     <td>HTTP</td>
复制代码

网址
http://www.xicidaili.com/


问大神:如何修改上面的那个正则表达式,让它只匹配含有“高匿”项的 ip 呢?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-16 08:54:04 | 显示全部楼层
加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-16 10:25:04 | 显示全部楼层
我也刚刚开始学习,加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-16 10:35:58 | 显示全部楼层
小剑剑 发表于 2016-5-15 23:05
撸主把问题想复杂了,没必要一次就找出所有要的信息,
先找出高匿的
至于2位数字与4位数字用   \ ...

谢谢大神、一下子又学会了好多知识,
另外还有最后一个问题!
刚刚我自己调试的时候,发现这里:
  1. alt="Cn" /></td>    # 这里“Cn”的后面为什么要加上“空格 和 除号”呢?“ /”
复制代码


而且如果不加这个的话,程序无法实现,这里是怎么回事,好深奥?



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-16 13:05:28 | 显示全部楼层
宝贝归来 发表于 2016-5-16 10:35
谢谢大神、一下子又学会了好多知识,
另外还有最后一个问题!
刚刚我自己调试的时候,发现这里:

额,你想多了,不是我要加空格而是他本身就有,你把 W3用记事本保存下来看看
我不是大神
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-16 19:44:42 | 显示全部楼层
小剑剑 发表于 2016-5-16 13:05
额,你想多了,不是我要加空格而是他本身就有,你把 W3用记事本保存下来看看
我不是大神

谢谢你啦,另外我知道为什么“审查元素”和用Python 读取的“W3”不一样了!
因为,审查元素 和 查看网页源码 还是有一点区别的,这个区别可以说是源代码和DOM的区别,我们审查元素,实际上是查看DOM,DOM渲染过了,查看网页源码看到的才是未解析的源代码,也就是我们用Python读取到的代码~。
所以,以后用爬虫的时候还是要看网页源代码才行~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表