2010-06-17 13 views

Respuesta

8

BeautifulSoup no es una biblioteca DOM per se (no implementa las API DOM). Para hacer las cosas más complicadas, estás usando espacios de nombres en ese fragmento xml. Para analizar esa pieza específica de XML, tendrá que utilizar BeautifulSoup de la siguiente manera:

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 no se está usando espacios de nombres, el código podría tener este aspecto:

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 clave aquí es que BeautifulSoup no sabe (ni le importa) nada sobre los espacios de nombres. Por lo tanto, web:Web se trata como una etiqueta web:web en lugar de como una etiqueta Web que pertenece al espacio de nombres web. Mientras BeautifulSoup agrega web:web al diccionario de elementos xml, la sintaxis de python no reconoce web:web como un identificador único.

Puede obtener más información al leer documentation.

+0

gracias! funciona perfectamente ahora Siempre estoy confundido en cuanto a qué dar para encontrar() ..y estas definiciones de espacio de nombres y la forma en que están escritas me confunde mucho ... ¡cualquier enlace para aclarar todo eso sería muy apreciado! – demos

+0

Solo el enlace de documentación que ya te di ... y mucha experimentación. –

+0

'AttributeError: el objeto 'NoneType' no tiene ningún atributo '% s'% –

6

Ésta es una vieja pregunta, pero alguien podría no saber que al menos BeautifulSoup 4hace espacios de nombres manejar bien si pasa 'xml' como segundo argumento del constructor:

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

Esto no es exactamente cierto para la versión 4.4.1-1 (en ubuntu 64 16.04). Como los comentarios son limitados Ver [enlace] (https://pastebin.com/Q99iK6tM) –

0

Debe definir explícitamente el espacio de nombres de la raíz elemento, usando la sintaxis xmlns:prefix="URI" (see examples here), y luego accede a su atributo a través del prefix:tag desde BeautifulSoup. Tenga en cuenta lo que también debe definir explícitamente, cómo debe procesar BeautifulSoup su documento, en ese caso:

xml = BeautifulSoup(xml_content, 'xml')

Cuestiones relacionadas