Python Mechanize теряет атрибуты при втором открытии - PullRequest
2 голосов
/ 04 декабря 2009

Это действительно специализированный случай, и мне неловко спрашивать его; однако я в конце концов работаю над этим.

Мне нужно следить за номером отслеживания через форму и страницу результатов, поэтому я использую Mechanize в python, ссылка после отправки формы встроена в javascript, поэтому я не могу просто следовать follow_link. То, что я хочу сделать, это вывести URL-адрес и затем попросить позвонить open(), но когда я это сделаю, я столкнусь с некоторыми проблемами.

Я могу нормально вызывать br.geturl() и br.title() на целевой странице, но когда приходит время прочитать исходную страницу, о которой идет речь, выдается

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

Есть ли способ сделать это, или я слишком много исправляю, любой совет будет потрясающим

edit [больше кода {действительно ужасно просто пытаться заставить его работать}]:

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 голосов
/ 04 декабря 2009

Вы никогда не делаете первый .read вызов метода в экземпляре браузера. Это потому, что у него нет такого метода. У Browswer.response есть метод read, поэтому, если вы хотите получить тело ответа, вам нужно сделать:

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

В будущем вы можете использовать dir(obj) для просмотра содержимого объекта obj, будь то браузер или что-то еще.

...