как избежать косой черты в xpath? - PullRequest
2 голосов
/ 02 ноября 2011

Как мне избежать косой черты в запросе xpath? Мои теги содержат URL, поэтому я должен быть в состоянии сделать это. Я использую lxml в Python.

Или же xpath может запросить подстроку пути? Примеры ниже:

xml="""
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gsa="http://schemas.google.com/gsa/2007">
  <gsa:content name="reportName">bbb</gsa:content>
  <gsa:content name="collectionName">default_collection</gsa:content>
  <gsa:content name="reportDate">date_3_25_2009</gsa:content>
 </entry>
"""

Когда я запускаю следующее:

tree=fromstring(xml)
for elt in tree.xpath('//*'):
    elt.tag

Возвращает:

'{http://www.w3.org/2005/Atom}entry'
'{http://schemas.google.com/gsa/2007}content'
'{http://schemas.google.com/gsa/2007}content'
'{http://schemas.google.com/gsa/2007}content'

Запуск tree.xpath('/entry') возвращает пустой список.

Мне нужно иметь возможность либо запросить '{http://www.w3.org/2005/Atom}entry' в качестве тега, либо запросить' entry 'в любом месте тега.

1 Ответ

3 голосов
/ 02 ноября 2011

Просмотр namespace prefixes [документы] .

Если вы хотите элемент, который находится в пространстве имен http://schemas.google.com/gsa/2007, вы должны искать его следующим образом:

import lxml.etree as et

xml="""
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gsa="http://schemas.google.com/gsa/2007">
  <gsa:content name="reportName">bbb</gsa:content>
  <gsa:content name="collectionName">default_collection</gsa:content>
  <gsa:content name="reportDate">date_3_25_2009</gsa:content>
 </entry>
"""

NS = {'rootns': 'http://www.w3.org/2005/Atom',
      'gsa': 'http://schemas.google.com/gsa/2007'}

tree = et.fromstring(xml)

for el in tree.xpath('//gsa:content', namespaces=NS):
    print el.attrib['name']

print len(tree.xpath('//rootns:entry', namespaces=NS))
...