Xpath:为每个特定元素获取特定的前兄弟元素


Xpath : Get specific preceding siblings for each specific element

我的HTML格式如下:

<div class="menu">
    <h3 class="menu_item_title">Title of first category</h3>
    <div class="menu_item">Item 1</div>
    <div class="menu_item">Item 2</div>
    <div class="menu_item">Item 3</div>
    <h3 class="menu_item_title">Title of second category</h3>
    <div class="menu_item">Item 4</div>
    <div class="menu_item">Item 5</div>
    <div class="menu_item">Item 6</div>
    <div class="menu_item">Item 7</div>
    <div class="menu_item">Item 8</div>
    <div class="menu_item">Item 9</div>
</div>

我想有每个"menu_item"的H3"menu_item_title"前面的元素。因此,对于前3个元素,我想找到"第一类别的标题",对于其余的,我想找到"第二类别的标题"。

在这个例子中,我只有两个类别,但实际上还有更多。

我试着这样做:

//div[contains(concat(" ", normalize-space(@class), " "), " menu_item ")]/preceding::h3[contains(concat(" ", normalize-space(@class), " "), " menu_items_title ")]

但没有成功。

谁能给我来点魔法

"我想有一个查询输出3次:第一个类别的标题和6次:第二个类别的标题"

这不能仅在纯XPath 1.0中完成,您需要一些PHP来完成此任务。一种可能的方法是执行首先返回div元素的XPath:

//div[contains(concat(" ", normalize-space(@class), " "), " menu_item ")]

…然后遍历结果并对每个div执行以下相对XPath以获得相应的h3元素:

./preceding-sibling::h3[contains(concat(" ", normalize-space(@class), " "), " menu_item_title ")][1]

我不确定您是否想多次获得每个h3元素的结果(每个menu_item一次)或仅一次,但在后者的情况下,以下XPath

//div[@class='menu_item']/preceding::h3[@class='menu_item_title']

产生结果

<h3 class="menu_item_title">Title of first category</h3>
<h3 class="menu_item_title">Title of second category</h3>

请注意,当您调整这里的错字时,您的问题中提到的方法也会产生相同的结果:menu_items_title应该是preceding::h3[contains(concat(" ", normalize-space(@class), " "), " menu_items_title ")]部分的menu_item_title