Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lxml解析器无法在变量中存储文本_Python_Lxml - Fatal编程技术网

Python lxml解析器无法在变量中存储文本

Python lxml解析器无法在变量中存储文本,python,lxml,Python,Lxml,因此,我不熟悉使用Python进行xml解析,并且在以下方面遇到了一些问题: 我正在搜索特定的标记,并将它们的值存储到列表中,然后将其写入csv文件 带文本的值存储良好,但带数字的值似乎失败,出现以下错误: Traceback (most recent call last): File "C:\Desktop\IDLE - Copy.py", line 19, in <module> Qty = things.find('PosQuantityAmt', root.nsmap).te

因此,我不熟悉使用Python进行xml解析,并且在以下方面遇到了一些问题:

我正在搜索特定的标记,并将它们的值存储到列表中,然后将其写入csv文件

带文本的值存储良好,但带数字的值似乎失败,出现以下错误:

Traceback (most recent call last):
File "C:\Desktop\IDLE - Copy.py", line 19, in <module>
Qty = things.find('PosQuantityAmt', root.nsmap).text
AttributeError: 'NoneType' object has no attribute 'text'
我能很好地得到价值观

8400.0000
15666.0000
75.0000
135697.0000
4528.0000
3224.0000
21352.0000
9734.0000
352000.0000
732.0000
2539.0000
37.7370
21007.6700
60.0000
1100.0000
59877.3300
30000.0000
30000.0000
30000.0000
30000.0000
30000.0000
这是我的密码:

from lxml import etree
import csv

tree = etree.parse('C:/Desktop/ECDS_POS.xml')
root = tree.getroot()

f = open('C:/Desktop/test.csv', 'w')
csvwriter = csv.writer(f)

head = ['Port Code','ISIN','Qty','Cost']
csvwriter.writerow(head)


for things in root.findall('ROW', root.nsmap):
    lists = []

    portcode = things.find('CustId',root.nsmap).text

    Qty = things.find('PosQuantityAmt', root.nsmap).text

    ISIN = things.find('PosSecIsin', root.nsmap).text

    cost = things.find('PosCostPriceAmt', root.nsmap).text

    lists.append(portcode + ";" + Qty + ";" + ISIN + ";" + cost )
    csvwriter.writerow(lists)

f.close()
xml文件的片段:

    <?xml version="1.0"?>

-<ECDS RowCount="392" ToDate="2017-10-02" FromDate="2017-10-02" Table="POS" ExtractionTime="2017-10-25T17:44:27" 
xmlns="https://cnchedwsvcp01/ecds/pos/1">

-<ROW>

<EntityCod>BZH</EntityCod>

<CustId>707144</CustId>

<PortfId>707144-1</PortfId>

<PosId>SC.707144-1.277639-600.590084....</PosId>

<SystemIdCod>SC</SystemIdCod>

<PosHfmCod>550 05</PosHfmCod>

<PosHfmDsc>Equities</PosHfmDsc>

<PosNameTxt>Hochschild Mining PLC Hochschild Mini/RegSh GBP0.25</PosNameTxt>

<PosValuationDat>2017-10-02</PosValuationDat>

<PosPriceAmt>2.2490</PosPriceAmt>

<PosCcyCod>GBP</PosCcyCod>

<PosPriceTypeCod>0</PosPriceTypeCod>

<PosPriceTypeDsc>UNIT PRICE</PosPriceTypeDsc>

<PosEstimAmt>18891.6000</PosEstimAmt>

<PosEstimRefAmt>25062.4000</PosEstimRefAmt>

<PosEstimRefCcyCod>USD</PosEstimRefCcyCod>

<PosRefRateAmt>0.7537</PosRefRateAmt>

<PosQuantityAmt>8400.0000</PosQuantityAmt>

<PosSecId>277639-600</PosSecId>

<PosSecIsin>GB00B1FW5029</PosSecIsin>

<PosValorenId>2776396</PosValorenId>

<PosSubAssetTypeCod>101</PosSubAssetTypeCod>

<PosSubAssetTypeDsc>EQUITIES</PosSubAssetTypeDsc>

<PosPriceDat>2017-10-24</PosPriceDat>

<XrGroupDsc>EQUITIES</XrGroupDsc>

<XrGroupId>2</XrGroupId>

<PosContractSizeAmt>1</PosContractSizeAmt>

<PosCostEstimAmt>22675.9500</PosCostEstimAmt>

<PosCostEstimRefAmt>30386.3800</PosCostEstimRefAmt>

<PosCostPriceAmt>2.6995</PosCostPriceAmt>

<PosCostPriceRefAmt>3.6176</PosCostPriceRefAmt>

<PosCostPriceRefRateAmt>0.7462</PosCostPriceRefRateAmt>

<PosAssetTypeCod>10</PosAssetTypeCod>

<PosAssetTypeDsc>SHARES</PosAssetTypeDsc>

</ROW>

-
-
BZH
707144
707144-1
SC.707144-1.277639-600.590084。。。。
联合国安全理事会
550 05
股票
Hochschild矿业有限公司Hochschild Mini/RegSh 0.25英镑
2017-10-02
2.2490
英镑
0
单价
18891.6000
25062.4000
美元
0.7537
8400
277639-600
GB00B1FW5029
2776396
101
股票
2017-10-24
股票
2.
1.
22675.9500
30386.3800
2.6995
3.6176
0.7462
10
分享

我遇到另一个错误:“ValueError:ElementPath中不支持空命名空间前缀”。lxml不接受
{None:'中的
None
https://cnchedwsvcp01/ecds/pos/1“}
,它是
root.nsmap
的值。我没有得到那个错误。也不知道如何复制以进行调查。如果我注释掉Qty和cost变量并调整final lists.append,它运行正常。似乎lxml处理数字的方式与处理文本字符串的方式不同。在解析包含数字的标记时,.find方法会发现错误……好吧,所以这是一个我没有考虑到的小问题:数量和成本标记并不存在于所有行部分中(有很多)。所以代码失败了,因为找不到任何东西。如果这些标记不存在,我会添加条件来传递,并且它会很好地填充csv文件。
    <?xml version="1.0"?>

-<ECDS RowCount="392" ToDate="2017-10-02" FromDate="2017-10-02" Table="POS" ExtractionTime="2017-10-25T17:44:27" 
xmlns="https://cnchedwsvcp01/ecds/pos/1">

-<ROW>

<EntityCod>BZH</EntityCod>

<CustId>707144</CustId>

<PortfId>707144-1</PortfId>

<PosId>SC.707144-1.277639-600.590084....</PosId>

<SystemIdCod>SC</SystemIdCod>

<PosHfmCod>550 05</PosHfmCod>

<PosHfmDsc>Equities</PosHfmDsc>

<PosNameTxt>Hochschild Mining PLC Hochschild Mini/RegSh GBP0.25</PosNameTxt>

<PosValuationDat>2017-10-02</PosValuationDat>

<PosPriceAmt>2.2490</PosPriceAmt>

<PosCcyCod>GBP</PosCcyCod>

<PosPriceTypeCod>0</PosPriceTypeCod>

<PosPriceTypeDsc>UNIT PRICE</PosPriceTypeDsc>

<PosEstimAmt>18891.6000</PosEstimAmt>

<PosEstimRefAmt>25062.4000</PosEstimRefAmt>

<PosEstimRefCcyCod>USD</PosEstimRefCcyCod>

<PosRefRateAmt>0.7537</PosRefRateAmt>

<PosQuantityAmt>8400.0000</PosQuantityAmt>

<PosSecId>277639-600</PosSecId>

<PosSecIsin>GB00B1FW5029</PosSecIsin>

<PosValorenId>2776396</PosValorenId>

<PosSubAssetTypeCod>101</PosSubAssetTypeCod>

<PosSubAssetTypeDsc>EQUITIES</PosSubAssetTypeDsc>

<PosPriceDat>2017-10-24</PosPriceDat>

<XrGroupDsc>EQUITIES</XrGroupDsc>

<XrGroupId>2</XrGroupId>

<PosContractSizeAmt>1</PosContractSizeAmt>

<PosCostEstimAmt>22675.9500</PosCostEstimAmt>

<PosCostEstimRefAmt>30386.3800</PosCostEstimRefAmt>

<PosCostPriceAmt>2.6995</PosCostPriceAmt>

<PosCostPriceRefAmt>3.6176</PosCostPriceRefAmt>

<PosCostPriceRefRateAmt>0.7462</PosCostPriceRefRateAmt>

<PosAssetTypeCod>10</PosAssetTypeCod>

<PosAssetTypeDsc>SHARES</PosAssetTypeDsc>

</ROW>