2008-11-13 6 views
5

Étant donné un lien HTML commeDecomposing HTML pour lier le texte et la cible

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

comment puis-je isoler l'URL et le texte?

Mises à jour

J'utilise soupe Belle, et je suis incapable de comprendre comment faire.

j'ai fait

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

links = soup.findAll('a') 

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

je reçois

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

Pourquoi suis-je manque le contenu?

edit: élaboré sur 'collé' comme le conseille :)

+0

Le fichier urllib.urlopen (url) a probablement un problème. Essayez d'imprimer cela et voyez ce que vous obtenez. Ce devrait être le HTML direct de la page Web. –

+0

Aussi, "coincé!" n'est pas très descriptif. Montrer plus de code et ce qui ne va pas. –

+0

Merci pour les informations supplémentaires, cela a rendu beaucoup plus facile de voir ce qui se passait. –

Répondre

8

Utilisez Beautiful Soup. Le faire vous-même est plus difficile qu'il n'y paraît, vous ferez mieux d'utiliser un module éprouvé.

EDIT:

Je pense que vous voulez:

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

Par ailleurs, il est une mauvaise idée d'essayer d'ouvrir l'URL là, comme si ça ne va pas, il pourrait devenir laid.

EDIT 2:

Cela devrait vous montrer tous les liens dans une page:

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

Je suis d'accord, Beatiful Soup est probablement la meilleure façon de gérer cela. – monkut

+0

serait-il préférable d'ouvrir l'URL ailleurs et de vérifier les erreurs lui-même? – sundeep

+0

Oui, et essayez-le ... sauf autour de lui juste au cas où il échouerait. –

6

Voici un exemple de code, montrant obtenir les attributs et le contenu des liens:

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

Bien que je suppose que les autres pourraient être correct en vous indiquant d'utiliser Beautiful Soupe, ils pourrait pas pas, et en utilisant une bibliothèque externe pourrait être massivement over-the-top à vos fins. Voici une regex qui fera ce que vous demandez.

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

Voici ce qu'il correspond:

'<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 vous voulez obtenir juste le texte (par exemple: « textsomething » dans le second exemple ci-dessus), je venais de courir un autre regex sur il pour dépouiller quelque chose entre les parenthèses pointues.

+0

Avec cette approche, vous devez faire attention aux sauts de ligne dans le code source. Assurez-vous de définir l'indicateur re.DOTALL lorsque vous compilez votre motif. – tgray

4

On dirait que vous avez deux questions là-bas:

  1. link.content s, non link.content
  2. attrs est un dictionnaire, pas une chaîne. Il contient des paires de valeurs clés pour chaque attribut dans un élément HTML. lien.attrs ['href'] vous obtiendra ce que vous semblez rechercher, mais vous voudrez l'emballer dans un chèque au cas où vous rencontreriez un tag sans attribut href.
+0

oui, c'était le contenu * s * issue .. im un dumbass. Merci ! – sundeep

Questions connexes