使用 xpath 时索引错误超出范围

Index error out of range while using xpath

我遇到错误:使用此代码在行 key = element.xpath('./@ID')[0] 上列出索引超出范围:

from lxml import etree
from urllib.request import urlopen


url = urlopen('https://raw.githubusercontent.com/ArthurK-GH/Instances/main/sprint01.xml')
doc = etree.parse(url)
root = doc.getroot()

DictShiftType= {}
DictDay = {}

pat = root.xpath('//Pattern')
for element in pat:
    key = element.xpath('./@ID')[0]
    shift = element.xpath('.//ShiftType/text()')
    day = element.xpath('.//Day/text()')
    DictShiftType[key]=shift
    DictDay[key]=day

但是,如果我 copy/paste 我要查找的 XML 文档的一部分,我会使用 fromstring 和 copy/past 相同的代码行来阅读它它按预期工作:

patterns = """
  <Patterns>
    <Pattern ID="0" weight="1">
      <PatternEntries>
        <PatternEntry index="0">
          <ShiftType>L</ShiftType>
          <Day>Any</Day>
        </PatternEntry>
        <PatternEntry index="1">
          <ShiftType>D</ShiftType>
          <Day>Any</Day>
        </PatternEntry>
      </PatternEntries>
    </Pattern>
    <Pattern ID="1" weight="1">
      <PatternEntries>
        <PatternEntry index="0">
          <ShiftType>D</ShiftType>
          <Day>Any</Day>
        </PatternEntry>
        <PatternEntry index="1">
          <ShiftType>E</ShiftType>
          <Day>Any</Day>
        </PatternEntry>
        <PatternEntry index="2">
          <ShiftType>D</ShiftType>
          <Day>Any</Day>
        </PatternEntry>
      </PatternEntries>
    </Pattern>
    <Pattern ID="2" weight="1">
      <PatternEntries>
        <PatternEntry index="0">
          <ShiftType>None</ShiftType>
          <Day>Friday</Day>
        </PatternEntry>
        <PatternEntry index="1">
          <ShiftType>Any</ShiftType>
          <Day>Saturday</Day>
        </PatternEntry>
        <PatternEntry index="2">
          <ShiftType>Any</ShiftType>
          <Day>Sunday</Day>
        </PatternEntry>
      </PatternEntries>
    </Pattern>
  </Patterns>
"""

doc = etree.fromstring(patterns)
DictShiftType= {}
DictDay = {}

pat = doc.xpath('//Pattern')
for element in pat:
    key = element.xpath('./@ID')[0]
    shift = element.xpath('.//ShiftType/text()')
    day = element.xpath('.//Day/text()')
    DictShiftType[key]=shift
    DictDay[key]=day
DictDay 

输出:

{'0': ['Any', 'Any'],
 '1': ['Any', 'Any', 'Any'],
 '2': ['Friday', 'Saturday', 'Sunday']}

因为我必须遍历几组数据,所以我无法在我的代码中 copy/paste xml 文档,所以我尝试在开始时使用 fromstring代码而不是 parse 但它不起作用。你能帮我弄清楚我的错误在哪里吗?谢谢

如果您分析 xml 结构,还有其他名为 Pattern 的标签导致索引错误,因为它们没有 <Pattern ID="0" weight="1">,请参见示例:

<Pattern>0</Pattern>
<Pattern>1</Pattern>
<Pattern>2</Pattern>

如果您只是将 pat xpath 更改为:pat = root.xpath('//Patterns/Pattern'),您的代码将起作用:

from lxml import etree
from urllib.request import urlopen


url = urlopen('https://raw.githubusercontent.com/ArthurK-GH/Instances/main/sprint01.xml')
doc = etree.parse(url)
root = doc.getroot()

DictShiftType= {}
DictDay = {}

pat = root.xpath('//Patterns/Pattern')
for element in pat:
    key = element.xpath('./@ID')[0]
    shift = element.xpath('.//ShiftType/text()')
    day = element.xpath('.//Day/text()')
    DictShiftType[key]=shift
    DictDay[key]=day

输出:

{'0': ['Any', 'Any'],
 '1': ['Any', 'Any', 'Any'],
 '2': ['Friday', 'Saturday', 'Sunday']}