2010-05-22 5 views
2

Je suis en train de construire un analyseur et enregistrer les résultats sous forme d'un fichier xml mais j'ai des problèmes ..Python regex sur la liste

Est-ce que vous les experts s'il vous plaît jeter un oeil à mon code?

Traceback: TypeError: expected string or buffer

import urllib2, re 
from xml.dom.minidom import Document 
from BeautifulSoup import BeautifulSoup as bs 
osc = open('OSCTEST.html','r') 
oscread = osc.read() 
soup=bs(oscread) 
doc = Document() 
root = doc.createElement('root') 
doc.appendChild(root) 
countries = doc.createElement('countries') 
root.appendChild(countries) 
findtags1 = re.compile ('<h1 class="title metadata_title content_perceived_text(.*?)`</h1>', re.DOTALL | re.IGNORECASE).findall(soup) 
findtags2 = re.compile ('<span class="content_text">(.*?)</span>', re.DOTALL | re.IGNORECASE).findall(soup) 
for header in findtags1: 
title_elem = doc.createElement('title') 
countries.appendChild(title_elem) 
header_elem = doc.createTextNode(header) 
title_elem.appendChild(header_elem) 
for item in findtags2: 
    art_elem = doc.createElement('artikel') 
    countries.appendChild(art_elem) 
    s = item.replace('<P>','') 
    t = s.replace('</P>','') 
    text_elem = doc.createTextNode(t) 
    art_elem.appendChild(text_elem)  

print doc.toprettyxml() 
+0

Bonjour Peter; bienvenue à SO. Mettez en surbrillance le code et appuyez sur ctrl-k pour le formater correctement. J'ai essayé d'enlever une partie de l'espace tout en conservant, je l'espère, votre code. Si j'ai fait une erreur, veuillez annuler. – bernie

+0

Aussi, s'il vous plaît poster le retraçage si vous le pouvez; qui montrera la ligne où l'erreur se produit. Merci. – bernie

+0

Je suppose que l'erreur est ici: 're.compile ('....'). Findall (soupe)' –

Répondre

5

Il est bon que vous essayez d'utiliser BeautifulSoup pour analyser HTML, mais cela ne fonctionnera pas:

re.compile('<h1 class="title metadata_title content_perceived_text(.*?)`</h1>', 
      re.DOTALL | re.IGNORECASE).findall(soup) 

Vous essayez d'analyser un objet BeautifulSoup en utilisant une expression régulière. Au lieu de cela, vous devriez utiliser la méthode findAll sur la soupe, comme ceci:

regex = re.compile('^title metadata_title content_perceived_text', re.IGNORECASE) 
for tag in soup.findAll('h1', attrs = { 'class' : regex }): 
    print tag.contents 

Si vous ne voulez vraiment analyser le document sous forme de texte avec une expression régulière alors ne pas utiliser BeautifulSoup - il suffit de lire le document en chaîne et analyser cela. Mais je vous suggère de prendre le temps d'apprendre comment fonctionne BeautifulSoup, car c'est la façon préférée de le faire. Voir le documentation pour plus de détails.

+0

ah oui MAIS il ne trouvera pas le reste .. J'ai de vrais problèmes obtenir BS pour trouver le contenu à partir des balises .. –

+0

@Peter Nielsen: Pouvez-vous expliquer ce que vous voulez dire par «il ne trouvera pas le reste»? Est-ce que ma mise à jour répond à votre question? –

+0

Eh bien, en utilisant bs et non regex me donne le problème de savoir comment je trouve le contenu à l'intérieur des balises et pas seulement l'étiquette entière + contenu .. Ty pour répondre si rapide, au fait :-) –