2008-11-13 14 views
5

Dado un enlace HTML comode descomposición del HTML para enlazar el texto y el objetivo

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

cómo puedo aislar me la URL y el texto?

Actualizaciones

estoy usando sopa hermoso, y no puedo encontrar la manera de hacer eso.

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 estoy perdiendo el contenido?

edición: elaborado en 'pegado' tal como se aconseja :)

+0

Es probable que haya un problema con urllib.urlopen (url). Intenta imprimir eso y ver lo que obtienes. Debe ser el HTML directo de la página web. –

+0

Además, "¡atascado!" no es muy descriptivo Mostrar más código y qué es exactamente lo que está mal. –

+0

Gracias por la información adicional, hizo que fuera mucho más fácil ver lo que estaba sucediendo. –

Respuesta

8

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

EDIT:

creo que quiere:

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

Por cierto, que es una mala idea para tratar de abrir la URL allí, como si las cosas van mal se podría poner feo.

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

Estoy de acuerdo, Beatiful Soup es probablemente la mejor manera de manejar esto. – monkut

+0

¿sería mejor abrir la url en otro lugar y verificar si hay errores? – sundeep

+0

Sí, y pruébalo ... excepto por ahí por si falla. –

6

Aquí está un ejemplo de código, mostrando conseguir los atributos y contenidos de los enlaces:

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

Aunque supongo que los otros podrían ser sean correctos al indicarle que use Beautiful Sopa, no pueden , y el uso de una biblioteca externa puede ser excesivo para sus propósitos. Aquí hay una expresión regular que hará lo que pidas.

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

Esto es lo que coincide con:

'<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 quisieras conseguir simplemente el texto (por ejemplo: "textsomething" en el segundo ejemplo anterior), que acababa de ejecutar otra expresión regular sobre es despojar cualquier cosa entre corchetes puntiagudos.

+0

Con este enfoque, debe tener cuidado con los saltos de línea en el código fuente. Asegúrese de configurar el indicador re.DOTALL cuando compile su patrón. – tgray

4

Parece que tienes dos problemas allí:

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

sí, era el problema del contenido * s *. Im a dumbass. Gracias ! – sundeep

Cuestiones relacionadas