2011-04-26 18 views
6

Soy nuevo en lxml y estoy tratando de encontrar la forma de reescribir enlaces utilizando iterlinks().Cómo reemplazar enlaces utilizando lxml y iterlinks

import lxml.html 
html = lxml.html.document_fromstring(doc) 
for element, attribute, link, pos in html.iterlinks(): 
    if attibute == "src": 
     link = link.replace('foo', 'bar') 
print lxml.html.tostring(html) 

Sin embargo, esto no reemplaza los enlaces. Sé que puedo usar .rewrite_links, pero iterlinks proporciona más información sobre cada enlace, por lo que preferiría usar esto.

Gracias de antemano.

Respuesta

6

En lugar de asignar un nuevo valor (cadena) al nombre de variable link, debe modificar el elemento en sí, en este caso estableciendo su src atributo:

new_src = link.replace('foo', 'bar') # or element.get('src').replace('foo', 'bar') 
element.set('src', new_src) 

Tenga en cuenta que - si sabe qué "enlaces" usted está interesado en, por ejemplo, sólo img elementos - también se puede obtener los elementos mediante el uso de .findall() (o XPath o selectores CSS) en lugar de usando .iterlinks().

+0

Perfecto, gracias. – cyrus

0

Probablemente el enlace es solo una copia del objeto real. Intenta reemplazar el atributo del elemento en tu ciclo. Incluso el elemento puede ser solo una copia, pero merece una prueba ...

1

lxml proporciona un método rewrite_links (o función que se pasa el texto que se analiza en un documento) para proporcionar un método para cambiar todos los enlaces en un documento:

.rewrite_links (link_repl_func, resolve_base_href = True , base_href = None): Esto reescribe todos los enlaces en el documento utilizando su función de reemplazo de enlace. Si otorga un valor de base_href, todos los enlaces se transferirán una vez que se hayan unido a esta URL. Para cada enlace se llama link_repl_func (link). Esa función luego devuelve el nuevo enlace, o None para eliminar el atributo o etiqueta que contiene el enlace. Tenga en cuenta que se transferirán todos los enlaces, incluidos enlaces como "#anchor" (que es puramente interno) y cosas como "mailto: [email protected]" (o javascript: ...).

Cuestiones relacionadas