Механизм Python, следующий по ссылке и какой параметр nr? - PullRequest
20 голосов
/ 25 августа 2010

Извините, что должен спросить что-то подобное, но документации Python по механизации, похоже, действительно не хватает, и я не могу понять это ... они приводят только один пример, который я могу найти для перехода по ссылке:

response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1)

Но я не хочу использовать регулярное выражение, я просто хочу перейти по ссылке, основанной на ее URL, как бы я это сделал ... и что такое "nr", который иногда используется для перехода по ссылкам?

Спасибо за любую информацию

Ответы [ 4 ]

49 голосов
/ 25 августа 2010

br.follow_link принимает либо Link объект, либо ключевое слово arg (например, nr=0).

br.links() перечисляет все ссылки.

br.links(url_regex='...') перечисляет все ссылки, URL-адреса которых соответствуют регулярному выражению.

br.links(text_regex='...') перечисляет все ссылки, текст ссылки которых соответствуетРегулярное выражение.

br.follow_link(nr=num) следует за num-й ссылкой на странице со счетом, начинающимся с 0. Он возвращает объект ответа (того же типа, который возвращает br.open (...))

br.find_link(url='...') возвращает объект Link, чей url точно равен данному URL.

br.find_link, br.links, br.follow_link, br.click_link все принимают одинаковые ключевые слова,Запустите help(br.find_link), чтобы просмотреть документацию по этим ключевым словам.

Редактировать: Если у вас есть целевой URL, которому вы хотите следовать, вы можете сделать что-то вроде этого:

import mechanize
br = mechanize.Browser()
response=br.open("http://www.example.com/")
target_url='http://www.rfc-editor.org/rfc/rfc2606.txt'
for link in br.links():
    print(link)
    # Link(base_url='http://www.example.com/', url='http://www.rfc-editor.org/rfc/rfc2606.txt', text='RFC 2606', tag='a', attrs=[('href', 'http://www.rfc-editor.org/rfc/rfc2606.txt')])
    print(link.url)
    # http://www.rfc-editor.org/rfc/rfc2606.txt
    if link.url == target_url:
        print('match found')
        # match found            
        break

br.follow_link(link)   # link still holds the last value it had in the loop
print(br.geturl())
# http://www.rfc-editor.org/rfc/rfc2606.txt
16 голосов
/ 26 августа 2010

Я нашел этот способ сделать это, для справки для тех, кто не хочет использовать регулярное выражение:

r = br.open("http://www.somewebsite.com")
br.find_link(url='http://www.somewebsite.com/link1.html')
req = br.click_link(url='http://www.somewebsite.com/link1.html')
br.open(req)
print br.response().read()

Или это также будет работать по тексту ссылки:

r = br.open("http://www.somewebsite.com")
br.find_link(text='Click this link')
req = br.click_link(text='Click this link')
br.open(req)
print br.response().read()
2 голосов
/ 03 октября 2010

nr используется для ссылки, по которой вы переходите.Если текст или URL-адрес вы были регулярным выражением более одного.значение по умолчанию - 0 , поэтому, если вы используете значение по умолчанию, вы будете следовать ссылке в первом регулярном выражении вообще.например, источник:

<a href="link.html>Click this link</a>
<a href="link2.html>Click this link</a>

, в этом примере нам нужно следовать тексту «Нажмите эту ссылку», но мы выбираем link2.html, чтобы точно следовать

br.click_link(text='Click this link', nr=1)

, и вы получитеlink2.html ответ

2 голосов
/ 25 августа 2010

Смотря на код, я подозреваю, что вы хотите

response1 = br.follow_link(link=LinkObjectToFollow)

nr такое же, как описано в вызове find_link.

РЕДАКТИРОВАТЬ: В моем первом беглом взгляде я не понимал, что «ссылка» не была простой ссылкой.

...