[Python] Buscar todos los elementos asignados Atributo espaciado de nombres


Answers

BeautifulSoup (ambas versiones 3 y 4) no parece tratar el prefijo del espacio de nombres como algo especial. Solo trata el nombre de espacio-prefijo y el atributo de espacio de nombre como un atributo que tiene dos puntos en su nombre.

Entonces, para encontrar como elementos <p> con atributos en el espacio de nombres foo , solo tiene que recorrer todas las teclas de atributos y verificar si attr.startswith('foo') :

import BeautifulSoup as bs
content = '''\
<p>blah</p>
<p foo:bar="something">blah</p>
<p foo:xxx="something">blah</p>'''

soup = bs.BeautifulSoup(content)
for p in soup.find_all('p'):
    for attr in p.attrs.keys():
        if attr.startswith('foo'):
            print(p)
            break

rendimientos

<p foo:bar="something">blah</p>
<p foo:xxx="something">blah</p>

Con lxml puede buscar por XPath, que tiene soporte de sintaxis para buscar atributos por espacio de nombres:

import lxml.etree as ET
content = '''\
<root xmlns:foo="bar">
<p>blah</p>
<p foo:bar="something">blah</p>
<p foo:xxx="something">blah</p></root>'''

root = ET.XML(content)
for p in root.xpath('p[@foo:*]', namespaces={'foo':'bar'}):
    print(ET.tostring(p))

rendimientos

<p xmlns:foo="bar" foo:bar="something">blah</p>
<p xmlns:foo="bar" foo:xxx="something">blah</p>
Question

Si tengo algo así:

<p>blah</p>
<p foo:bar="something">blah</p>
<p foo:xxx="something">blah</p>

¿Cómo obtendría beautifulsoup para seleccionar elementos con un atributo del espacio de nombres foo?

Por ejemplo, me gustaría que se devolvieran los elementos 2º y 3º p.