Python mechanize 第二次打开时丢失属性

2 投票
1 回答
3205 浏览
提问于 2025-04-15 16:41

这是一个非常专业的情况,我觉得问这个问题有点尴尬;不过我现在真的不知道该怎么办了。

我需要通过一个表单跟踪一个追踪号码,并且最终到达结果页面,所以我在用Python的mechanize库。提交表单后,链接是嵌入在JavaScript里的,所以我不能直接用follow_link。我的想法是用正则表达式提取出这个网址,然后调用open()来打开它,但当我这样做时,遇到了一些问题。

我可以正常调用br.geturl()br.title()来获取目标页面的信息,但当我想读取这个页面的源代码时,就出现了错误:

AttributeError: mechanize._mechanize.Browser instance has no attribute read (perhaps you forgot to .select_form()?)

有没有什么办法可以做到这一点,还是我在搞得太复杂了?任何建议都非常感谢。

编辑 [更多代码 {真的很乱,只是想让它工作}]:

cosn="########"
baseurl="http://aaa.com/"
search="thing.do"

br=Browser()
br.open(baseurl+search)
br.select_form('traceForm')
br['consignments']=cosn
req=br.submit()
pars=Soup(req.read())
found_url=re.match(r"javascript:window.location.href = '(?P<url>[\w\d=&?\.]+)", pars.find('td', attrs={'class':'select'})['onclick']).group('url')

br.open(baseurl+found_url)
print br.title()  # works
print br.geturl()  # works
print br.read()  # throws exception

1 个回答

7

你永远不能在浏览器实例上直接调用 first.read 方法。因为浏览器本身没有这个方法。其实是 Browser.response 里有 read 方法,所以如果你想获取响应的内容,就需要这样做:

response = br.response()
response.read()

以后你可以使用 dir(obj) 来查看对象 obj 的内容,无论这个对象是浏览器还是其他什么东西。

撰写回答