对w:r兄弟姐妹的条件迭代

时间:2014-11-21 02:09:28

标签: python xml xpath lxml

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 &lt;EndNote&gt;&lt;Cite&gt;&lt;Author&gt;Su&lt;/Author&gt;&lt;Year&gt;2010&lt;/Year&gt;&lt;RecNum&gt;130&lt;/RecNum&gt;toethanol/metabolism&lt;/keyword&gt;&lt;keyword&gt;Molecular Sequence Data&lt;/keyword&gt;&lt;keyword&gt;Mutagenesis, Insertional&lt;/keyword&gt;&lt;keyword&gt;Sequence Alignment&lt;/keyword&gt;&lt;keyword&gt;/genetics/*metabolism&lt;/keyword&gt;&lt;/keywords&gt;&lt;dates&gt;&lt/EndNote&gt;</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语句有关..

2 个答案:

答案 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个运行实例中,因此在我收到文本后,我突然退出了循环。