选择所有dd标记,直到使用Xpath的新dl标记为止

2024-05-28 19:19:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个蹩脚的Xpath初学者,我希望用以下结构解析一个网站

<dl class="ismSummary ismHomeSummary">
        <dt>cat1</dt>
            <dd>value1</dd>
            <dd>value2</dd>
        <dt>cat2</dt>
            <dd>value1</dd>
            <dd>value2</dd>
</dl>

使用Xpath,我只想获得cat1的value1&value2(cat1的dd

这就是我现在拥有的

^{pr2}$

问题是它不会在cat2停止,并继续从cat2选择value1和value2。:(


Tags: 网站dt结构xpathddclassdl初学者
3条回答

尝试:

dt[text()="cat1"]/following-sibling::dd[preceding-sibling::dt[1]/text()='cat1']

使用

//dt[. = 'cat1']
     /following-sibling::dd
       [count(.| //dt[. = 'cat2']/preceding-sibling::dd)
       =
        count(//dt[. = 'cat2']/preceding-sibling::dd)
       ]

假设//dt[. = 'cat1']//dt[. = 'cat2']各自只选择一个元素,那么上面的表达式正好选择想要的两个dd元素。

基于XSLT的验证

^{pr2}$

当此转换应用于所提供的XML文档时(修改了最后两个dd的值,以便我们确定所需的元素被选中):

<dl class="ismSummary ismHomeSummary">
    <dt>cat1</dt>
    <dd>value1</dd>
    <dd>value2</dd>
    <dt>cat2</dt>
    <dd>value3</dd>
    <dd>value4</dd>
</dl>

计算XPath表达式并将其选择的节点复制到输出:

<dd>value1</dd>
<dd>value2</dd>

说明

这里我们使用的是XPath 1.0中的节点集交集的kayesian方法:

两个节点集$ns1$ns2的交集

$ns1[count(.|$ns2) = count($ns2)]

在我们的例子中,我们用代替$ns1

//dt[. = 'cat1']/following-sibling::dd

我们用代替$ns2

//dt[. = 'cat2']/preceding-sibling::dd

这里的所有节点都是dl的子节点,因此自然所有节点都是第一个dt的同级节点,因此当您使用following-sibling时,您可以获得所有这些节点。在

Xpath是考虑到xml的,在xml中,您可能会将dd元素作为dt的子元素,但不幸的是,这里不是这样。在

最简单的方法是只包含dt(不仅仅是dd)的所有同级,然后迭代结果集,直到出现dt。使用Xpath函数做同样的事情是可能的,但肯定更复杂。在

相关问题 更多 >

    热门问题