Механизм Python, переход по ссылке по URL-адресу и что такое параметр nr?

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

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

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

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


person Rick    schedule 25.08.2010    source источник
comment
Только что понял, что у меня, возможно, была ошибка в моих заголовках, из-за которой ссылки не работали ... спасибо людям, которые помогли, я думаю, что ваши ответы будут работать для меня, и я нашел другой, более простой способ сделать это на другом сайте, поэтому Я опубликую это здесь тоже для справки, как только закончу   -  person Rick    schedule 26.08.2010


Ответы (4)


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
person unutbu    schedule 25.08.2010
comment
@Rick: Если вы перебираете br.links(), вы можете посмотреть строку link.url, чтобы понять, хотите ли вы следовать ей или нет. Регулярное выражение не требуется. - person unutbu; 26.08.2010
comment
спасибо, я думаю, что понял теперь ... я не знаю, что это такое, но версии механизма python, которые у меня есть (последняя версия), похоже, не имеют многого в своем файле документа, не знаю почему .. в любом случае , спасибо за помощь, и я думаю, что смогу получить это, основываясь на том, что вы сказали, попробую - person Rick; 26.08.2010
comment
Я до сих пор не могу понять, как получить ссылку для соответствия, я пытаюсь использовать регулярное выражение в качестве полного URL-адреса, но он не дает совпадения (когда я выполняю цикл for, он никогда не входит в цикл, подразумевая, что он не получает никакого Спички) - person Rick; 26.08.2010
comment
@Rick: регулярное выражение сложно. Некоторые символы в вашем URL-адресе, такие как .*+?()[], имеют разные значения в контексте шаблона регулярного выражения, в отличие от простого сравнения строк. Поскольку у вас есть полный URL-адрес, вы можете использовать == для сравнения URL-адреса с link.url. Я добавил код, чтобы показать, что я имею в виду. - person unutbu; 26.08.2010
comment
спасибо, у меня большой опыт работы с регулярными выражениями, я думаю, проблема заключалась в том, что у меня была проблема с моими заголовками, я ценю вашу помощь, и я нашел другой способ сделать это без использования регулярных выражений, поэтому я опубликую это для справки, как только протестирую его - person Rick; 26.08.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()
person Rick    schedule 25.08.2010
comment
Мне это решение нравится намного больше, чем то, которое я предложил. (Я думаю, что это работает даже без вызовов br.find_link). Пожалуйста, примите это, чтобы оно всплыло наверх. - person unutbu; 26.08.2010

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

response1 = br.follow_link(link=LinkObjectToFollow)

nr совпадает с задокументированным в вызове find_link.

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

person jkerian    schedule 25.08.2010
comment
Я нашел информацию «nr» в самом коде. _mechanize.py в doctext для find_link... прямо в строке 614 - person jkerian; 25.08.2010
comment
ах точно я даже не думал что у них там будет док файл отличный от онлайн версии, так как я привык что он тоже онлайн, спасибо за подсказку - person Rick; 26.08.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

person Yuda Prawira    schedule 03.10.2010