Pregunta

Dado un enlace HTML como

<a href="urltxt" class="someclass" close="true">texttxt</a>

¿cómo puedo aislar la url y el texto?

Actualizaciones

Estoy usando Beautiful Soup y no puedo entender cómo hacerlo.

lo hice

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))

links = soup.findAll('a')

for link in links:
    print "link content:", link.content," and attr:",link.attrs

me sale

*link content: None  and attr: [(u'href', u'_redirectGeneric.asp?genericURL=/root    /support.asp')]*  ...
...

¿Por qué me falta el contenido?

editar: elaborado en 'pegado' como se recomienda :)

¿Fue útil?

Solución

Use Beautiful Soup . Hacerlo usted mismo es más difícil de lo que parece, será mejor que use un módulo probado.

EDIT:

Creo que quieres:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read())

Por cierto, es una mala idea intentar abrir la URL allí, ya que si sale mal, podría ponerse feo.

EDITAR 2:

Esto debería mostrar todos los enlaces en una página:

import urlparse, urllib
from BeautifulSoup import BeautifulSoup

url = "http://www.example.com/index.html"
source = urllib.urlopen(url).read()

soup = BeautifulSoup(source)

for item in soup.fetchall('a'):
    try:
        link =  urlparse.urlparse(item['href'].lower())
    except:
        # Not a valid link
        pass
    else:
        print link

Otros consejos

Aquí hay un ejemplo de código, que muestra cómo obtener los atributos y el contenido de los enlaces:

soup = BeautifulSoup.BeautifulSoup(urllib.urlopen(url))
for link in soup.findAll('a'):
    print link.attrs, link.contents

Parece que tienes dos problemas allí:

  1. link.content s , no link.content
  2. attrs es un diccionario, no una cadena. Contiene pares de valores clave para cada atributo en un elemento HTML. link.attrs ['href'] le dará lo que parece estar buscando, pero querrá incluirlo en un cheque en caso de que encuentre una etiqueta sin un atributo href.

Aunque supongo que los otros podrían estar en lo correcto al indicarle que use Beautiful Soup, ellos podrían no hacerlo, y el uso de una biblioteca externa podría ser enormemente exagerado para sus propósitos Aquí hay una expresión regular que hará lo que le pidas.

/<a\s+[^>]*?href="([^"]*)".*?>(.*?)<\/a>/

Esto es lo que coincide:

'<a href="url" close="true">text</a>'
// Parts: "url", "text"

'<a href="url" close="true">text<span>something</span></a>'
// Parts: "url", "text<span>something</span>"

Si quisiera obtener solo el texto (p. ej., "textomething" en el segundo ejemplo anterior), simplemente pasaría otra expresión regular sobre él para quitar cualquier cosa entre corchetes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top