Python ';没有这样的孩子:pyval“;错误

Python ';没有这样的孩子:pyval“;错误,python,python-2.7,xml-parsing,lxml,Python,Python 2.7,Xml Parsing,Lxml,我正在阅读一本书(Python for Data Analysis),其中包含以下代码。运行循环时,我收到一个错误“no-soke-child:pyval”。我是否有语法错误或类似的问题 from lxml import objectify path = 'Performance_MNR.xml' parsed = objectify.parse(open(path)) root = parsed.getroot() data = [] skip_fields = ['PARENT_SEQ',

我正在阅读一本书(Python for Data Analysis),其中包含以下代码。运行循环时,我收到一个错误“no-soke-child:pyval”。我是否有语法错误或类似的问题

from lxml import objectify
path = 'Performance_MNR.xml'
parsed = objectify.parse(open(path))
root = parsed.getroot()
data = []
skip_fields = ['PARENT_SEQ', 'INDICATOR_SEQ', 'DESIRED_CHANGE', 'DECIMAL_PLACES']
for elt in root.INDICATOR:
    el_data = {}
    for child in elt.getchildren():
        if child.tag in skip_fields:
            continue
        el_data[child.tag] = child.pyval
        data.append(el_data)
回溯如下:

AttributeError                            Traceback (most recent call last)
<ipython-input-17-88720283f598> in <module>()
      4        if child.tag in skip_fields:
      5            continue
----> 6        el_data[child.tag] = child.pyval
      7    data.append(el_data)
      8 

lxml.objectify.pyx in lxml.objectify.ObjectifiedElement.__getattr__ (src/lxml/lxml.objectify.c:3497)()

lxml.objectify.pyx in lxml.objectify._lookupChildOrRaise (src/lxml/lxml.objectify.c:5947)()

AttributeError: no such child: pyval
AttributeError回溯(最近一次调用)
在()
4如果跳过字段中的child.tag:
5继续
---->6 el_数据[child.tag]=child.pyval
7.附加数据(el_数据)
8.
lxml.objectify.ObjectifiedElement.中的lxml.objectify.pyx.\uu getattr\uuuuu(src/lxml/lxml.objectify.c:3497)()
lxml.objectify.\u lookupChildOrRaise中的lxml.objectify.pyx(src/lxml/lxml.objectify.c:5947)()
AttributeError:没有这样的子项:pyval
试试这个:

for elt in root:
el_data = {}
for child in elt.getchildren():
    if child.tag in skip_fields:
        continue
    el_data[child.tag] = child.pyval
    data.append(el_data)

尝试将“pyval”更改为“text”,这样就可以了

data=[]
skip_fields=['PARENT_SEQ','INDICATOR_SEQ','DESIRED_CHANGE','DECIMAL_PLACES']
for elt in root.INDICATOR:
    el_data={}
    for child in elt.getchildren():
        if child.tag in skip_fields:
            continue
        el_data[child.tag]=child.text
    data.append(el_data)

我也在读这本书,遇到了同样的问题。这对我有用

skip_fields = ['PARENT_SEQ', 'INDICATOR_SEQ',
           'DESIRED_CHANGE', 'DECIMAL_PLACES', 'YEAR']

.pyval尝试返回最合适的python类型,而.text返回本机python字符串

“Python for Data Analysis”一书中的文件可以从

或(生的)

代码(python 3.6)

看起来很好用。列的数据类型可以通过

result.columns.to_series().groupby(result.dtypes).groups
=>{dtype('int64'):索引(['PERIOD\u MONTH','PERIOD\u YEAR',dtype='object'),dtype('O'):索引(['AGENCY\u NAME','CATEGORY','DESCRIPTION','FREQUENCY','INDICATOR\u NAME', ‘指标单位’、‘月度实际’、‘月度目标’、‘年初至今实际’, “年初至今目标”], dtype='object')}

用.text替换.pyval同样有效,但数据类型将明显改变

=>{dtype('O'):索引(['AGENCY\u NAME','CATEGORY','DESCRIPTION','FREQUENCY','INDICATOR\u NAME',', ‘指标单位’、‘每月实际’、‘每月目标’、‘期间月’, “期间/年度”、“本年度实际值”、“本年度目标值”], dtype='object')}

result.columns.to_series().groupby(result.dtypes).groups