2010-10-26 7 views
0

Je travaille sur un analyseur Web utilisant urllib. Je dois être capable de ne sauvegarder que les lignes qui se trouvent dans une certaine balise div. par exemple: je sauvegarde tout le texte dans le div "corps". Cela signifie que tout le texte contenu dans les balises div sera renvoyé. Cela signifie également que s'il y a d'autres divs à l'intérieur, c'est bien, mais dès que je frappe le parent, ça s'arrête. Des idées?Sélectionner uniquement du texte dans une balise div

Mon idée

  1. recherche de la div que vous êtes à la recherche pour.

  2. Enregistrer la position.

  3. Gardez une trace des divs dans le futur . +1 pour nouveau div -1 pour fin div.

  4. lorsque de retour à 0, votre chez votre parent div? Enregistrer l'emplacement

  5. Ensuite, enregistrer les données à partir de numéro jusqu'à la fin?

Répondre

3

Si vous n'êtes pas vraiment excité à l'idée de l'analyse syntaxique du code HTML vous-même, il y a deux bonnes options:

Beautiful Soup

Lxml

Vous constaterez probablement que Lxml fonctionne plus vite que BeautifulSoup, mais dans mes utilisations, Beautiful Soup était très facile à apprendre et à utiliser, et traitait le HTML typique de merde assez bien trouvé dans la nature pour que je n'aie pas besoin d'autre chose.

YMMV.

+1

homme que j'aime Beautifulsoup – JudoWill

3

En utilisant lxml:

import lxml.html as lh 
content='''\ 
<body> 
<div>AAAA 
    <div>BBBB 
    <div>CCCC 
    </div>DDDD 
    </div>EEEE 
</div>FFFF 
</body> 
''' 
doc=lh.document_fromstring(content) 
div=doc.xpath('./body/div')[0] 
print(div.text_content()) 
# AAAA 
# BBBB 
#  CCCC 
#  DDDD 
# EEEE 

div=doc.xpath('./body/div/div')[0] 
print(div.text_content()) 
# BBBB 
#  CCCC 
#  DDDD 
0

Personnellement, je préfère lxml en général, mais il y a des moments où il est la gestion du HTML est un peu hors ... Voici une recette BeautifulSoup si ça aide.

from BeautifulSoup import BeautifulSoup, NavigableString 

def printText(tags): 
    s = [] 
    for tag in tags : 
     if tag.__class__ == NavigableString : 
      s.append(tag) 
     else : 
      s.append(printText(tag)) 
    return "".join(s) 

html = "<html><p>Para 1<div class='stuff'>Div Lead<p>Para 2<blockquote>Quote 1</div><blockquote>Quote 2" 
soup = BeautifulSoup(html) 

v = soup.find('div', attrs={ 'class': 'stuff'}) 

print v.text_content 
Questions connexes