Python lxml XPath 语法错误 : invalid predicate

标签 python xml parsing xpath lxml

以下是描述表单的 XML 文件的一部分:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfHouse>
<XmlForm>
<houseNum>1</houseNum>
 <plan1> 
  <coord>
    <X> 1.2  </X>
    <Y> 2.1  </Y>
    <Z> 3.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 21.2  </X>
    <Y> 22.1  </Y>
    <Z> 31.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 0   </B>
</color>
 </plan2> 
</XmlForm>


<XmlForm>
<houseNum>2</houseNum>
 <plan1> 
  <coord>
    <X> 11.2  </X>
    <Y> 12.1  </Y>
    <Z> 13.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 255   </G>
    <B> 0   </B>
  </color>
 </plan1>
 <plan2>
  <coord>  
    <X> 211.2  </X>
    <Y> 212.1  </Y>
    <Z> 311.0  </Z>
  </coord>
  <color> 
    <R> 255 </R>
    <G> 0   </G>
    <B> 255   </B>
</color>
 </plan2> 
</XmlForm>
</ArrayOfHouse>

这是我的代码,用于恢复房屋 1 和 2 的每个计划的坐标,问题出在这一行 coord=tree.findall("XmlForm/[houseNum=str(houseindex)],使用houseindex.__str__()

时也会出现同样的问题
import pandas as pd
import numpy as np
from lxml import etree
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
tree =etree.parse("myexample.xml")
#recuperate the columns name for pandas dataframe
planlist=tree.findall("XmlForm/[houseNum='1']/")

columns=[]

for el in planlist[1:]:
    columns.append(el.tag)

#Declare pandas dataFrame
df=pd.DataFrame(columns=list('XYZ'),dtype=float)
for houseindex in range(0,2):
    for index in range(len(columns)):

        coord=tree.findall("XmlForm/[houseNum=str(houseindex)]/"+columns[index]+"/coord/")
        XYZ=[]
        for cc in coord:
            XYZ.append(cc.text)
        df.loc[index]=XYZ
print(df)

最佳答案

您显然希望在构造 XPath 表达式之前用 Python 解释 str(houseindex)。 (您的错误消息告诉您 str() 不是 XPath 函数。)

因此,将 coord=tree.findall() 的参数更改为

"XmlForm/[houseNum=str(houseindex)]/"+columns[index]+"/coord/"

"XmlForm/[houseNum="+str(houseindex)+"]/"+columns[index]+"/coord/"
<小时/>

对该 XPath 的另外两个修复:

  1. 删除 XmlForm 谓词之前的 /
  2. houseNum 的相等测试周围添加引号。

最终的 XPath,没有进一步的语法错误

以下 XPath 结合了所有三个修复,并且没有进一步的语法错误:

"XmlForm[houseNum='"+str(houseindex)+"']/"+columns[index]+"/coord/"

关于Python lxml XPath 语法错误 : invalid predicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801252/

相关文章:

c# - 将无效日期处理为有效日期?

python - flask / python 。从上传的文件中获取 mimetype

python - 在无限 while 期间写入文件

C# 依赖注入(inject)

html - 如何获得没有链接的文本?

android - 如何在约束布局中链接组?

java - 用 Java 解析 HTML 网页

python - Blob 触发函数无法读取某些 Excel 文件

python - 为一个热编码数据定义占位符张量

java - 将按钮中的数字插入到 EditText 中选定的位置