2010-06-17 4 views

Répondre

8

BeautifulSoup n'est pas une bibliothèque DOM en soi (elle n'implémente pas les API DOM). Pour compliquer les choses, vous utilisez des espaces de noms dans ce fragment xml. Pour analyser ce morceau spécifique de XML, vous utiliseriez BeautifulSoup comme suit:

from BeautifulSoup import BeautifulSoup 

xml = """<xml> 
    <web:Web> 
    <web:Total>4000</web:Total> 
    <web:Offset>0</web:Offset> 
    </web:Web> 
</xml>""" 

doc = BeautifulSoup(xml) 
print doc.find('web:total').string 
print doc.find('web:offset').string 

Si vous n'utilisez pas namespaces, le code pourrait ressembler à ceci: La clé ici est

from BeautifulSoup import BeautifulSoup 

xml = """<xml> 
    <Web> 
    <Total>4000</Total> 
    <Offset>0</Offset> 
    </Web> 
</xml>""" 

doc = BeautifulSoup(xml) 
print doc.xml.web.total.string 
print doc.xml.web.offset.string 

que BeautifulSoup ne sait rien (ou ne s'en soucie pas) sur les espaces de noms. Ainsi, web:Web est traité comme une étiquette web:web au lieu d'une étiquette Web appartenant à l'espace de noms web. Alors que BeautifulSoup ajoute web:web au dictionnaire d'éléments xml, la syntaxe python ne reconnaît pas web:web comme identifiant unique.

Vous pouvez en apprendre plus à ce sujet en lisant le documentation.

+0

merci! fonctionne parfaitement maintenant. Je suis toujours confus quant à ce qu'il faut donner à find() ..et ces définitions d'espace de noms et la façon dont elles sont écrites me déroutent beaucoup ... tout lien pour effacer tout cela serait apprécié! – demos

+0

Juste le lien de documentation que je vous ai déjà donné ... et beaucoup d'expérimentation. –

+0

'AttributeError: l'objet 'NoneType' n'a pas d'attribut 'chaîne' –

6

C'est une vieille question, mais quelqu'un pourrait ne pas savoir que au moins BeautifulSoup 4fait bien poignée namespaces si vous passez 'xml' comme deuxième argument du constructeur:

soup = BeautifulSoup("""<xml> 
<web:Web> 
<web:Total>4000</web:Total> 
<web:Offset>0</web:Offset> 
</web:Web> 
</xml>""", 'xml') 

print soup.prettify() 
<?xml version="1.0" encoding="utf-8"?> 
<xml> 
<Web> 
    <Total> 
    4000 
    </Total> 
    <Offset> 
    0 
    </Offset> 
</Web> 
</xml> 
+0

Ce n'est pas tout à fait vrai pour la version 4.4.1-1 (dans Ubuntu 64 16.04). Puisque les commentaires sont limités. Voir [lien] (https://pastebin.com/Q99iK6tM) –

0

Vous devez définir explicitement votre espace de noms racine élément, en utilisant la syntaxe xmlns:prefix="URI" (see examples here), puis vous accédez à votre attribut via prefix:tag de BeautifulSoup. Gardez à l'esprit, ce que vous devez également définir explicitement, comment BeautifulSoup devrait traiter votre document, dans ce cas:

xml = BeautifulSoup(xml_content, 'xml')

Questions connexes