2016-07-18 3 views
-1

Предположим, что у меня есть следующий XML:Как искать etree с помощью LXML как BeautifulSoup

<?xml version="1.0" encoding="utf-8"?> 
<FeedType xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://foo.com/bar" xsi:schemaLocation="https://foo.com/bar https://foo.com/bar/arr.xsd" value="Type"> 
    <ElementName value='Type'> 
     <DataIWant> 
      stuff 
     </DataIWant> 
     <DataIWant> 
      other stuff 
     </DataIWant> 
    </ElementName> 
</FeedType> 

И я хочу, чтобы получить все в ElementName теге.

В BeautifulSoup, можно было бы назвать

soup.find_all('ElementName') 

Что бы вернуть дерево с ElementName корнем.

Как это сделать в lxml?

+1

LXML имеет метод FindAll ... вы пытались использовать его еще? http://lxml.de/api/lxml.etree._Element-class.html#findall – kpie

+0

с использованием 'root.findall ('ElementName')' возвращает None. –

+0

@shivsn Если вы попытаетесь использовать ответ там, вы обнаружите, что он возвращает 'None' или' [] 'неправильно для моего xml. пример кода: 'XML = (' вещи другие вещи«) ' ' корень = etree. fromstring (xml) ' ' print (root.findall ("ElementName")) ' –

ответ

-1

lxml имеет findall method, который может использоваться.

Однако документ XML содержит пространство имен по умолчанию, и поэтому ищет простой ElementName тег не найти его - вам необходимо указать пространство имен:

root.findall('foobar:ElementName', namespaces = {'foobar': 'https://foo.com/bar'}) 

Если вы не хотите, чтобы указать пространство имен, вы можете использовать запрос XPath, который будет игнорировать пространство имен и просто найти элементы, «локальное имя» является ElementName:

root.xpath("//*[local-name() = 'ElementName']") 
+0

Можно ли игнорировать пространство имен или его автоматически анализировать, как в BeautifuSoup? –

+0

@Dr, вы можете игнорировать пространство имен с помощью XPath - см. Мой обновленный ответ. –

+0

Возможно ли сделать что-то вроде 'root.find_all ('ElementName', {'href': 'stuff' '})'? Как и в, выберите только ElementNames, для которых атрибут href является «материалом»? Извините, что вы так требовательны, но документацию lxml довольно сложно понять. –

Смежные вопросы