我的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