2010-02-06 14 views
4

Utilisation BeautifulSoup pour analyser mon XMLselfClosingTags à BeautifulSoup

import BeautifulSoup 

soup = BeautifulSoup.BeautifulStoneSoup("""<alan x="y" /><anne>hello</anne>""") # selfClosingTags=['alan']) 

print soup.prettify() 

Affichera:

<alan x="y"> 
<anne> 
    hello 
</anne> 
</alan> 

-à-dire, l'étiquette est un enfant anne de l'étiquette alan.

Si je passe selfClosingTags = [ 'alan'] quand je crée la soupe, je reçois:

<alan x="y" /> 
<anne> 
hello 
</anne> 

Great!

Ma question: pourquoi ne peut pas la présence du /> être utilisé pour indiquer une balise de fermeture auto?

Répondre

3

Vous demandez ce qui était dans l'esprit d'un auteur, après avoir constaté qu'il donne des noms tels que Beautiful [Pierre] Soupe aux classes/modules :-)

Voici deux exemples du comportement de BeautifulStoneSoup :

>>> soup = BeautifulSoup.BeautifulStoneSoup(
    """<alan x="y" ><anne>hello</anne>""" 
    ) 
>>> print soup.prettify() 
<alan x="y"> 
<anne> 
    hello 
</anne> 
</alan> 

>>> soup = BeautifulSoup.BeautifulStoneSoup(
    """<alan x="y" ><anne>hello</anne>""", 
    selfClosingTags=['alan']) 
>>> print soup.prettify() 
<alan x="y" /> 
<anne> 
hello 
</anne> 
>>> 

Mon avis: une balise de fermeture auto-n'est pas légale si elle est pas définie à l'analyseur. Ainsi, l'auteur avait des choix au moment de décider comment gérer un fragment illégal comme <alan x="y" /> ... (1) suppose que l'/ était une erreur (2) traiter alan comme une balise de fermeture auto-tout à fait indépendamment de la façon dont il pourrait être utilisé ailleurs dans le entrée (3) faire 2 passes sur l'entrée de l'écrou dans la première passe comment chaque étiquette a été utilisée. Quel choix préférez-vous?

1

Je n'ai pas « pourquoi », mais cela pourrait être vous intéresser. Si vous utilisez BeautifulSoup (pas de pierre) pour analyser XML avec une balise de fermeture auto-, cela fonctionne. Trier de:

>>> soup = BeautifulSoup.BeautifulSoup("""<alan x="y" /><anne>hello</anne>""") # selfClosingTags=['alan']) 
>>> print soup.prettify() 
<alan x="y"> 
</alan> 
<anne> 
hello 
</anne> 

L'imbrication est juste, même si alan est rendu comme un début et une balise de fin.