使用 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']}
我遇到错误:使用此代码在行 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']}