I have the following piece of xml:
<w:p>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/>
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
<w:lang w:val="en-US"/>
</w:rPr>
<w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/>
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
<w:lang w:val="en-US"/>
</w:rPr>
<w:instrText xml:space="preserve"> ADDIN EN.CITE <EndNote><Cite><Author>Su</Author><Year>2010</Year><RecNum>130</RecNum>toethanol/metabolism</keyword><keyword>Molecular Sequence Data</keyword><keyword>Mutagenesis, Insertional</keyword><keyword>Sequence Alignment</keyword><keyword>/genetics/*metabolism</keyword></keywords><dates></EndNote></w:instrText>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/>
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
<w:lang w:val="en-US"/>
</w:rPr>
<w:fldChar w:fldCharType="separate"/>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/>
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
<w:lang w:val="en-US"/>
</w:rPr>
<w:t>(ABCD et al. 2006)</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/>
<w:sz w:val="24"/>
<w:szCs w:val="24"/>
<w:lang w:val="en-US"/>
</w:rPr>
<w:fldChar w:fldCharType="end"/>
</w:r>
</w:p>
我想要做的是,搜索价值为w:fldChar
的{{1}},如果找到,请将级别移至"begin"
并搜索应包含的w:r
文本“w:instrText
”如果是,请再次转到w:r并提取下一个ADDIN EN.CITE
标记中包含的文本。
我尝试了以下但却没有产生任何结果:
w:t
出了什么问题?问题似乎与q.xpath语句有关..
答案 0 :(得分:0)
首先,
中的XPath表达式 for t in q.xpath('/../..//w:instrText...'...)
没有意义。初始/
表示“从根节点开始”(即最外层元素的父节点)。以下步骤..
表示“上下文节点的父节点”。但根节点没有父节点。所以这个表达式什么都不会选。 (实际上,在XPath 1.0中,/..
用作指定空节点集的便捷方式。)
相反,你可能想要
for t in q.xpath('../..//w:instrText...'...)
以上下文节点的父节点(t
的值)开始。
这将解决一个致命的问题。我不确定你的XPath是否正确,因为我无法跟踪你对它们应该做什么的描述。
答案 1 :(得分:0)
这不是很难,但需要一些研究。搜索后我可以使用以下方法提取文本:
w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
for p in source.xpath('.//w:p//w:instrText[contains(text(),"ADDIN EN.CITE")]',namespaces={'w':w}):
text+= " "
for q in p.xpath('../following-sibling::w:r//w:t',namespaces = {'w':w}):
text+= q.text
break
这很有效。以下兄弟迭代遍历同一级别的各种运行实例。由于文本包含在第4个运行实例中,因此在我收到文本后,我突然退出了循环。