2010-08-11 5 views
1

J'utilise BeautifulSoup en Python et je n'arrive pas à remplacer certaines balises. Je trouve <div> étiquettes et recherchant des enfants. Si ces enfants n'ont pas d'enfants (sont un noeud de texte de NODE_TYPE = 3), je les copie en tant que <p>.Problème lors de l'utilisation de replaceWith pour remplacer des balises HTML avec BeautifulSoup sur Python

from BeautifulSoup import Tag, BeautifulSoup 

class bar: 

self.soup = BeautifulSoup(self.input) 
foo() 
def foo(self):  
    elements = soup.findAll(True) 

    for node in elements: 

    # ....other stuff here if not <div> tags. 

    if node.name.lower() == "div": 
     if not node.find('a'): 
     newTag = Tag(self.soup, "p") 
     newTag.setString(node.text) 
     node.replaceWith(newTag) 
     nodesToScore.append(newTag) 
     else: 
     for n in node.findAll(True): 
      if n.getString(): # False if has children 
      newTag = Tag(self.soup, "p") 
      newTag.setString(n.text) 
      n.replaceWith(newTag) 

Je reçois un AttributeError:

File "file.py", line 125, in function 
    node.replaceWith(newTag) 
    File "BeautifulSoup.py", line 131, in replaceWith 
    myIndex = self.parent.index(self) 
AttributeError: 'NoneType' object has no attribute 'index' 

Je fais la même remplaçant sur node plus haut dans la boucle et il fonctionne correctement. Je suppose qu'il a des problèmes en raison de l'itération supplémentaire à travers le nœud que n. Qu'est-ce que je fais de mal ou quelle serait une meilleure façon de le faire? Merci! PS. J'utilise Python 2.5 pour Google Appengine et BeautifulSoup 3.0.8.1

Répondre

1

L'erreur dit:

myIndex = self.parent.index(self) 
AttributeError: 'NoneType' object has no attribute 'index' 

Ce code se produit sur la ligne 131 de BeautifulSoup.py. Il est dit que self.parent est None.

En regardant le code environnant montre que self doit être égal node dans votre code, car node appelle sa méthode replaceWith (Note:. Le message d'erreur indique node.replaceWith, mais le code affiché montre n.replaceWith Le code affiché ne fonctionne pas. correspondent au message d'erreur/traceback.) Donc, apparemment, node.parent est None.

Vous pouvez probablement éviter l'erreur en plaçant

if node.parent is not None: 

à un moment donné dans le code avant node.replaceWith est appelé.

Editer: Je vous suggère d'utiliser les instructions print pour rechercher où se trouve le code HTML lorsque node.parent est Aucun (c'est-à-dire où l'erreur se produit). Peut-être utiliser print node.contents ou print node.previous.contents ou print node.next.contents pour voir où vous êtes. Une fois que vous voyez le HTML, il peut devenir évident quelle est la situation pathologique dans laquelle node.parent est None.

+0

Merci de remarquer le 'node.replaceWith' vs le' n.replaceWith'. J'ai ajouté le code supplémentaire là où c'est référencé. Le 'si non 'fonctionne bien quand le' else' n'est pas présent, c'est pourquoi je pensais que ce n'était pas pertinent mais j'avais tort. – feesta

+0

@feesta: Ceci est difficile à déboguer sans voir le code HTML. J'ai ajouté un edit (ci-dessus) suggérant comment vous pourriez trouver le HTML qui correspond au problème. – unutbu

+0

@ ~ ubuntu Merci! il fonctionne maintenant! J'ai ajouté 'si node.parent est None: (node ​​de log) else: (le reste)' J'ai trouvé que le mauvais HTML était des balises 'div' avec seulement des espaces. Cela fait partie de ce que je suis en train de retirer. Merci encore! – feesta

Questions connexes