2010-08-25 7 views
19

Lamento tener que preguntar algo como esto, pero la documentación mecanizada de Python parece faltar y no puedo resolverlo ... solo dan un ejemplo que puedo encontrar para seguir un enlace:Python mecanize, siguiendo el enlace por url y ¿cuál es el parámetro nr?

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

Pero no quiero usar un regex, solo quiero seguir un enlace basado en su url, ¿cómo podría hacer esto ... también lo que es "nr" que se usa a veces para los siguientes enlaces?

Gracias por cualquier información

+0

Acabo de darme cuenta de que puedo haber tenido un error en mis encabezados que impedía que los enlaces funcionaran. Gracias a las personas que me ayudaron creo que sus respuestas funcionarán para mí y encontré otra manera más directa de hacerlo en otro sitio tan Voy a publicar eso aquí también para referencia una vez que haya terminado – Rick

Respuesta

49

br.follow_link toma un objeto Link o una palabra clave arg (como nr=0).

br.links() enumera todos los enlaces.

br.links(url_regex='...') enumera todos los enlaces cuyas URL coinciden con la expresión regular.

br.links(text_regex='...') enumera todos los enlaces cuyo texto de enlace coincide con la expresión regular.

br.follow_link(nr=num) sigue el enlace num º en la página, con contar a partir de 0. Devuelve un objeto de respuesta (el mismo tipo lo br.open (...) los rendimientos)

br.find_link(url='...') devuelve el objeto cuya Linkurl es exactamente igual a la url dada.

br.find_link, br.links, br.follow_link, br.click_link todos aceptan las mismas palabras clave. Ejecute help(br.find_link) para ver la documentación sobre esas palabras clave.

Editar: Si tiene una URL de destino que desea seguir, se podría hacer algo como esto:

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 
+0

@Rick: si recorre 'br.links()', puede mirar la cadena 'link.url' para averiguar si desea seguirlo o no. No se requiere regex. – unutbu

+0

gracias, creo que lo tengo ahora ... no sé qué es, pero las versiones de python que tengo (última versión) no parecen tener mucho en su archivo de documento, no estoy seguro de por qué ... de todos modos, gracias por la ayuda y creo que puedo obtenerlo en base a lo que dices, intentaré – Rick

+1

Todavía no puedo encontrar la manera de hacer que un enlace coincida, estoy tratando de usar la expresión regular como la URL completa pero es no dar una coincidencia (cuando hago el ciclo for nunca entra en el ciclo, lo que implica que no está obteniendo ninguna coincidencia) – Rick

2

De mirar el código, que sospechan que desea

response1 = br.follow_link(link=LinkObjectToFollow) 

nr es el mismo tal como se documenta en la convocatoria find_link.

EDITAR: En mi primera mirada superficial, no me di cuenta de que "enlace" no era un simple enlace.

+0

Encontré la información 'nr' en el código en sí. _mechanize.py en el texto para find_link ... a la vuelta de la línea 614 – jkerian

+0

oh, ni siquiera pensé que tendrían un archivo doc allí diferente de la versión en línea, ya que estoy acostumbrado también a estar en línea, gracias para la sugerencia – Rick

16

encontré esta forma de hacerlo, como referencia para cualquier persona que no lo hace quiere usar expresiones regulares:

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

O, va a trabajar por el texto del enlace también:

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

Me gusta esta solución mucho mejor que la que sugerí. (Creo que incluso funciona sin las llamadas a 'br.find_link'). Por favor, acepte este para que burbujee hasta la cima. – unutbu

2

nr se usa para el enlace exacto que sigue. si el texto o la URL ha sido regex más de uno. el valor predeterminado es , por lo que si usa el valor predeterminado, seguirá primero el enlace regex. por ejemplo la fuente:

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

en este ejemplo tenemos que seguir "Haga clic en este enlace de" texto, sino que elegimos link2.html seguir exactamente

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

por ella obtendrá Link2. html response

Cuestiones relacionadas