0

Python 3.6、Lxml、Windows 10

我快疯了。我想访问项目字段。但我总是得到错误:

AttributeError:“cython_function_or_method”对象没有属性“item”

其他所有内容(地址字段等...)我可以毫无问题地访问。如何访问项目字段(sku、金额等)?

我用过这段代码:

import requests
from lxml import objectify

url = "URL_TO_XML_FILE"
xml_content = requests.get(url).text.encode('utf-8')

xml = objectify.fromstring(xml_content)

for sale in xml.response.sales.sale:
    for item in sale.items.item:
        print(item.sku)

这是xml的开头:

<?xml version="1.0" encoding="ISO-8859-1"?>
<getnewsalesresult xmlns="https://pmcdn.priceminister.com/res/schema/getnewsales">
  <request>
    <version>2017-08-07</version>
    <user>SELLER</user>
  </request>  

  <response>
    <lastversion>2017-08-07</lastversion>
    <sellerid>95029358</sellerid>
    <sales>

      <sale>
        <purchaseid>297453287592813953</purchaseid>
        <purchasedate>15/12/2018-19:10</purchasedate>
        <deliveryinformation>
          <shippingtype>Normal</shippingtype>
          <isfullrsl>N</isfullrsl>

          <purchasebuyerlogin><![CDATA[LOGIN]]></purchasebuyerlogin>                  
          <purchasebuyeremail>EMAIL</purchasebuyeremail>        


            <deliveryaddress>
            <civility>Mme</civility>
            <lastname><![CDATA[Lastname]]></lastname>
            <firstname><![CDATA[Firstname]]></firstname>
            <address1><![CDATA[STREET]]></address1>
            <address2><![CDATA[]]></address2>
            <zipcode>13570</zipcode>
            <city><![CDATA[Paris]]></city>

            <country><![CDATA[France]]></country>
            <countryalpha2>FX</countryalpha2>

              <phonenumber1></phonenumber1>
              <phonenumber2>PHONENUMBER</phonenumber2>

            </deliveryaddress>

        </deliveryinformation>
        <items>

          <item>
            <sku><![CDATA[SKU1]]></sku>
            <advertid>411812243030</advertid>
            <advertpricelisted>
              <amount>15.99</amount>
              <currency>EUR</currency>
            </advertpricelisted>
            <itemid>551131040</itemid>
            <headline><![CDATA[HEADLINE]]></headline>
            <itemstatus><![CDATA[REQUESTED]]></itemstatus>
            <ispreorder>N</ispreorder>
            <isnego>N</isnego>
            <negotiationcomment></negotiationcomment>
            <price>
              <amount>15.99</amount>
              <currency>EUR</currency>
            </price>
            <isrsl>N</isrsl>
            <isbn></isbn>
            <ean>4363745894373857474; </ean>
            <paymentstatus><![CDATA[INCOMING]]></paymentstatus>
            <sellerscore></sellerscore>
          </item>
        </items>
      </sale>
      <sale>
4

2 回答 2

2

问题是items实际上是ObjectifiedElement的一个方法,所以表达式sale.items实际上返回了该方法,因为它具有优先级。

要获得您想要的“项目”对象,您必须更明确地获取sale的属性,而不是首先寻找类的方法,这是通常的 python 顺序。当您访问属性时,这就是 python 在后台执行的操作,您也可以这样做:

sale.__getattr__('items')

这也将起作用(它是对象属性的类似字典的接口):

sale.__dict__['items']

修改后的代码:

import requests
from lxml import objectify

url = "URL_TO_XML_FILE"
xml_content = requests.get(url).text.encode('utf-8')

xml = objectify.fromstring(xml_content)

for sale in xml.response.sales.sale:
    for item in sale.__dict__['items'].item:
        print(item.sku)
于 2018-12-16T15:44:54.033 回答
1

解决这个问题的另一种方法是避免使用易碎的属性接口:

for sale in xml['response']['sales']['sale']:
    for item in sale['items']['item']:
        print(item['sku'])

使用类似 dict 的索引接口,您不必担心某些属性名称(包括诸如itemsindexkeysremovereplacetagsettext、 和等常用词values)返回令人惊讶的结果。

于 2018-12-16T16:12:47.237 回答