Подтвердить что ты не робот

Механизм Python, следуя ссылке по url и каков параметр nr?

Мне жаль, что мне нужно спросить что-то вроде этого, но документация по механизации python кажется действительно отсутствующей, и я не могу понять это. Они дают только один пример, который я могу найти для ссылки:

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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()

Ответ 3

От взгляда на код, я подозреваю, что вы хотите

response1 = br.follow_link(link=LinkObjectToFollow)

nr - это то же самое, что и при вызове find_link.

EDIT: В моем первом беглом взгляде я не понял, что "ссылка" была не простой ссылкой.

Ответ 4

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