2

我目前正在从HTML. 我想提取两个<p class="xfHeading">标签之间的文本。

         <p class="xfHeading"><b>XYZ:</b></p> 
            <p>asdfghjk</p>  
            <p>sdsdsd</p>  
            <p>asdvcvcfghjk</p>  

         <p class="xfHeading"><b>ABC:</b></p> 
            <P>fvgbhnjm</P>  

         <p class="xfHeading"><b>PQR:</b></p> 
            <ul> 

            </ul> 

         <p class="xfHeading"><b>MNO:</b></p> 
             <ul> 
                <li>jdjshdj</li>  
             </ul> 

输出应该是:

asdfghjk

sdsdsd

asdvcvcfghjk

一种方法是:

/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]

或者

/p[class="xfHeading"]/following-sibling::p[position()<4]

但是,由于两者之间的内容一直在变化,我需要一个解决方案,其中<p class="xfHeading">提取两个标签之间的内容。

4

2 回答 2

0

编辑:在您澄清之后,我的建议是使用如下的FLWOR表达式。这会根据该标签的唯一内容查找<p>具有适当标签内容的 a,并返回与其同级的每个标签的文本。<b><b><p>

for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
    where $b/text() = "XYZ:"
        return p/text()

请注意,这//是一个 XPATH 构造,而不是注释

旧答案:如果没有您希望生成的数据是什么样子的示例,回答这个问题有点困难。但是,例如,要选择<b>标签内的文本,您可以:

/p[class = "xfHeading"]/b/text()

通常,附加text()到表达式的末尾会返回相关节点内的文本。

于 2010-06-25T13:39:54.580 回答
0

使用

(//p[@class="xfHeading"])[1]
          /following-sibling::p
             [. << (//p[@class="xfHeading"])[2]]
                 /text()

这意味着: 选择文档中属性值为 的第一个元素的p兄弟姐妹之后的所有元素的文本节点子节点,同时选择文档中属性值为的第二个元素之前的所有元素的文本节点子节点。pclassxfHeadingpclassxfHeading

于 2010-06-25T21:09:18.017 回答