2010-06-17 7 views

risposta

8

BeautifulSoup non è una libreria DOM di per sé (non implementa le API DOM). Per rendere le cose più complicate, stai usando gli spazi dei nomi in quel frammento xml. Per analizzare quel pezzo specifico di XML, utilizza BeautifulSoup come segue:

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 

Se non stava utilizzando namespace, il codice potrebbe essere la seguente:

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 

La chiave qui è che BeautifulSoup non sa (o cura) nulla di namespace. Pertanto, web:Web viene considerato come un tag web:web anziché come tag Web appartenente allo spazio dei nomi web. Mentre BeautifulSoup aggiunge web:web al dizionario degli elementi xml, la sintassi python non riconosce web:web come un unico identificatore.

Per ulteriori informazioni, consultare lo documentation.

+0

grazie! funziona perfettamente ora. Mi sto sempre confondendo su cosa dare a find() ..e queste definizioni di namespace e il modo in cui sono scritte mi confonde molto ... qualsiasi link per cancellare tutto ciò sarebbe apprezzato! – demos

+0

Solo il link alla documentazione ti ho già dato ... e molti esperimenti. –

+0

'AttributeError: L'oggetto 'NoneType' non ha attributo 'stringa'' –

6

Questa è una vecchia questione, ma qualcuno potrebbe non sapere che almeno BeautifulSoup 4fa namespace gestire bene se si passa 'xml' come secondo argomento al costruttore:

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

Questo non è esattamente vero per la versione 4.4.1-1 (in ubuntu 64 16.04). Poiché i commenti sono limitati. Vedi [collegamento] (https://pastebin.com/Q99iK6tM) –

0

È necessario definire in modo esplicito lo spazio dei nomi sulla radice elemento, usando la sintassi xmlns:prefix="URI" (see examples here), e quindi accedi all'attributo tramite prefix:tag da BeautifulSoup. Tieni presente ciò che dovresti anche definire esplicitamente, in che modo BeautifulSoup dovrebbe elaborare il tuo documento, in tal caso:

xml = BeautifulSoup(xml_content, 'xml')

Problemi correlati