返回信息流程序大概是这样
使用正则表达式在网页上找些东西,一个页面上有好多个结果
-----------------------------------------------
abc=re.compile('用了一个非常长的表达式,我就不打了‘)
pagedata=urllib2.urlopen(url)
if abc.search(pagedata):
start = time.time()
rs=abc.finditer(pagedata)
while True:
try:
i=next(rs) #一般卡在这
if time.time()-start >= 5 : return XXX # 我本想做个计时器的
#以下是结果的处理,不打了。。
except:
异常处理部分
return #这段代码是在一个函数里的。。。
-------------------------------------------
问题说明:
程序结构基本就是这样,其它位置我确保没有错误,
在跑了上百个网页,都没有出错(其实就是抓取新浪微博博文)
突然它就卡在了 i=next(rs) 这个位置
在SHELL里运行时,按cltr+C后,代码又能继续执行。
意即 它在第一次用next取迭代器结果时后就卡在里面不动了,使用cltr+c 抛出异常后这个循环又能继续了。
把该页面的数据单独拿出来处理,也没有任何问题,不会出现卡住之类的情况。
看起来像 next()函数取不到东西,陷入了死循环。
我在网上查过一篇文章,当next()取不到东西,又没有抛出 stopiteration异常时,就会这样。。。
在I5 的机器上跑, 出现这个问题时CPU占用率为25%不变。
如果放任不管,20分钟+后,它又能继续运行了。。。真鬼畜!!
-------
说明2 :
最初没写这么复杂,直接用的 for i in rs :
不过没找到问题出在哪,改成上面的代码后才比较直观
这是一条镜像帖。来源:北邮人论坛 / soft-design / #43657同步于 2013/8/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[python][求助] 使用next取迭代器的时候程序不动了。。。。。
lomizandtyd
2013/8/6镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
另外,如果你需要抓网页上的东西,建议适用xpath,而不是正则表达式。比如用lxml。
如果需要访问HTTP,建议用requests库,而不是urllib或者urllib2。
【 在 nuanyangyang 的大作中提到: 】
: 另外,如果你需要抓网页上的东西,建议适用xpath,而不是正则表达式。比如用lxml。
: 如果需要访问HTTP,建议用requests库,而不是urllib或者urllib2。
很感谢你的建议!
其实 在 except: 中我有写 break... 上面忘记标明了。
另外在情况二中,我使用过for i in rs: 来取迭代器的内容,结果也卡住了。
用正则表达式的原因主要是不太会lxml和HTTP语法,因为是一边自学一边写的,而且时间有点紧。。。
另外就是感觉lxml同样是基于正则表达式,大概差不多。
实际应用的时候使用的是mechanize模块Browser对象,不知道和requests区别大吗?
HTTP入门应该从哪入手?~
问题主要在这个函数调用很多次后(我成功的用这段代码解析了300+的网页),然后程序会停在i=next(rs)这一行。
我发现它停在这一行的过程是这样:
在我使用try except 仅捕获stopiteration和type error异常时,
我发现程序停下来了,一直在解析页面,
然后在SHELL下按cltr+c 结束程序,返回的结果显示它一直在做这个操作: i=next(rs)
我认为它停在这一行的另外一个原因:
在以上代码中,我给出了if time.time()-start >=5 : break
意思是如果陷入的是while 的死循环,那么最多在这呆5S就退出,
当然我的目的并没有实现,实际运行时它还是会持续的卡在这个位置,停止时间在20分钟+,
然后突然又能继续工作(中间没有人工干预)
需要代码吗?
用正则解析HTML?。。。这样不好吧。。。
推荐PyQuery,不过需要有jQuery基础。
如果没有的话,可以用HtmlParser,也很Easy的。。。
还有BeautifulSoup?这个没用过。我一直用Pyquery的。。。
祝好~
还是贴代码吧。怀疑是一些细节上的问题。
你不需要HTTP语法,你需要HTML语法。(其实很简单)上w3schools.com可以找到一些简单明了的教程。用XPath绝对比正则表达式简单。我曾经用正则解析过网页,会死人的……
requests只是HTTP客户端,不具备网页内容解析的功能。mechanize更自动化一些,可以解析网页,像一个没有窗口的浏览。不过如果只是发送个别的HTTP请求,用requests就够了。
【 在 lomizandtyd 的大作中提到: 】
:
: 很感谢你的建议!
: 其实 在 except: 中我有写 break... 上面忘记标明了。
: ...................
【 在 nuanyangyang 的大作中提到: 】
: 还是贴代码吧。怀疑是一些细节上的问题。
: 你不需要HTTP语法,你需要HTML语法。(其实很简单)上w3schools.com可以找到一些简单明了的教程。用XPath绝对比正则表达式简单。我曾经用正则解析过网页,会死人的……
: requests只是HTTP客户端,不具备网页内容解析的功能。mechanize更自动化一些,可以解析网页,像一个没有窗口的浏览。不过如果只是发送个别的HTTP请求,用requests就够了。
: ...................
代码已经传到1楼的附件了。
目标网页是某个用户weibo.cn如"http://weibo.cn/u/userid/"的网页内容。(不是登录的用户)
【 在 Wizmann 的大作中提到: 】
: 用正则解析HTML?。。。这样不好吧。。。
: 推荐PyQuery,不过需要有jQuery基础。
: 如果没有的话,可以用HtmlParser,也很Easy的。。。
: ...................
pyquery ? 我会试试的!
python就是模块太多不好找~