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
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
@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
@ ~ 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