Estoy tratando de analizar un XML con BeautifulSoup, pero frente a un muro cuando se trata de utilizar el "recursive" atributo con findall()BeautifulSoup etiquetas anidadas
Tengo un formato XML bastante extraño se muestra a continuación:
<?xml version="1.0"?>
<catalog>
<book>
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
<book>true</book>
</book>
<book>
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
<book>false</book>
</book>
</catalog>
como se puede ver, la etiqueta libro repite dentro de la etiqueta del libro, lo que provoca un error cuando intento a algo como:
from BeautifulSoup import BeautifulStoneSoup as BSS
catalog = "catalog.xml"
def open_rss():
f = open(catalog, 'r')
return f.read()
def rss_parser():
rss_contents = open_rss()
soup = BSS(rss_contents)
items = soup.findAll('book', recursive=False)
for item in items:
print item.title.string
rss_parser()
como se verá, en mi soup.findTodos he añadido recursive = false, que en teoría no haría recurse a través del elemento encontrado, pero salta al siguiente.
no parece que esto funcione, ya que siempre sale el siguiente error:
File "catalog.py", line 17, in rss_parser
print item.title.string
AttributeError: 'NoneType' object has no attribute 'string'
Estoy seguro de que estoy haciendo algo estúpido aquí, y agradecería si alguien me podría dar un poco de ayuda en Cómo resolver este problema.
Cambiar la estructura HTML no es una opción, este código debe tener un buen rendimiento, ya que potencialmente analizará un archivo XML de gran tamaño.
.children errors, y hacerlo por "libro" solo devuelve el primer elemento –
Mi error, lo he corregido para findChildren(). Pero '.findAll ("book") 'funciona para mí. ¿Estás seguro de que usaste FindAll, not find? –
Malo, * I * terminó publicando el XML incorrecto aquí. He actualizado un poco la estructura, así que representa exactamente lo que tengo, y la razón por la cual soup.findAll ("book" no funciona para mí –