Descomponer HTML para vincular texto y destino
-
08-07-2019 - |
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 :)
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í:
- link.content s , no link.content
- 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.