Использование XPath в ElementTree

Это только должно быть проблемой, если пользователи бота платят недопустимыми кредитными картами или чем-то. Таким образом как насчет нетехнического решения?

Обработка пользователи бота как обычные пользователи пока их платежи действительны и удостоверяются, что у Вас есть достаточно в запасе для удовлетворения совокупного спроса.

Результат: больше продаж. Вы находитесь в бизнесе, чтобы делать деньги, исправиться?

35
задан Mel 9 October 2017 в 09:35
поделиться

3 ответа

У вас есть 2 проблемы.

1) элемент содержит только корневой элемент, а не рекурсивно весь документ. Это элемент типа Element, а не ElementTree.

2) В вашей строке поиска должны использоваться пространства имен, если вы сохраняете пространство имен в XML.

Чтобы исправить проблему №1:

Вам необходимо изменить:

element = ET.parse(fp).getroot()

на :

element = ET.parse(fp)

Чтобы исправить проблему №2:

Вы можете удалить xmlns из XML-документа, чтобы он выглядел так:

<?xml version="1.0"?>
<ItemSearchResponse>
  <Items>
    <Item>
      <ItemAttributes>
        <ListPrice>
          <Amount>2260</Amount>
        </ListPrice>
      </ItemAttributes>
      <Offers>
        <Offer>
          <OfferListing>
            <Price>
              <Amount>1853</Amount>
            </Price>
          </OfferListing>
        </Offer>
      </Offers>
    </Item>
  </Items>
</ItemSearchResponse>

В этом документе вы можете использовать следующую строку поиска:

e = element.findall('Items/Item/ItemAttributes/ListPrice/Amount')

Полный код:

from elementtree import ElementTree as ET
fp = open("output.xml","r")
element = ET.parse(fp)
e = element.findall('Items/Item/ItemAttributes/ListPrice/Amount')
for i in e:
  print i.text

Альтернативное решение проблемы №2:

В противном случае вам нужно указать xmlns внутри строки поиска для каждого элемента.

Полный код:

from elementtree import ElementTree as ET
fp = open("output.xml","r")
element = ET.parse(fp)

namespace = "{http://webservices.amazon.com/AWSECommerceService/2008-08-19}"
e = element.findall('{0}Items/{0}Item/{0}ItemAttributes/{0}ListPrice/{0}Amount'.format(namespace))
for i in e:
    print i.text

Оба печатают:

2260

59
ответ дан 27 November 2019 в 06:49
поделиться
from xml.etree import ElementTree as ET
tree = ET.parse("output.xml")
namespace = tree.getroot().tag[1:].split("}")[0]
amount = tree.find(".//{%s}Amount" % namespace).text

Также рассмотрите возможность использования lxml . Это намного быстрее.

from lxml import ElementTree as ET
7
ответ дан 27 November 2019 в 06:49
поделиться

Дерево элементов использует пространства имен, поэтому все элементы в вашем xml имеют такие имена, как { http://webservices.amazon.com/AWSECommerceService/2008-08-19 } Предметы

Итак, включите поисковое пространство имен например

search = '{http://webservices.amazon.com/AWSECommerceService/2008-08-19}Items/{http://webservices.amazon.com/AWSECommerceService/2008-08-19}Item/{http://webservices.amazon.com/AWSECommerceService/2008-08-19}ItemAttributes/{http://webservices.amazon.com/AWSECommerceService/2008-08-19}ListPrice/{http://webservices.amazon.com/AWSECommerceService/2008-08-19}Amount'
element.findall( search )

дает элемент, соответствующий 2260

6
ответ дан 27 November 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: