遍历xpath中的子li节点

时间:2018-08-16 20:11:12

标签: php dom xpath

我有以下HTML:

$page = '<html>
<head>
<title>Page</title>
</head>

<body>

<div>
    <div>
        <div>
        </div>
        <div class="this one">
            <h2>Ignore</h2>
            <p>Text</p>

            <h2>Header 1</h2>
            <ul><li>List Value 1</li></ul>

            <h2>Header 2</h2>
            <ul><li>List Value 2</li></ul>

            <h2>Ignore</h2>
            <ul><li>List Value 3</li></ul>

            <h2>Header 3</h2>
            <ul>
                <li>List Value A</li>
                <li>List Value B</li>
                <li>List Value C</li>
            </ul>

            <h2>Ignore</h2>
            <p>Text</p>
        </div>
    </div>
</div>

</body>
</html>';

我正在尝试仅获取li的{​​{1}}列表,并且以下代码不起作用;

Header 3

我期望输出:

$doc->loadHTML($page);   
$xpath = new DomXPath($doc);

$nodes = $xpath->query("//div[@class='this one']/h2[.='Header 3']/ul/li");
foreach($nodes as $node) { 
    echo $node->nodeValue . "<br />";
}

1 个答案:

答案 0 :(得分:3)

这是您想要的表达式:

//div[@class = 'this one']/h2[text() = 'Header 3']/following-sibling::ul[1]/li

细说:

  • //div[@class = 'this one']-将文档中的所有<div>与指定的class属性值匹配

  • …/h2[text() = 'Header 3']-匹配所有<h2>的孩子,这些<div>是具有指定文本内容的…/following-sibling::ul的孩子

  • following-sibling-使用<ul>轴来匹配<h2>之后出现的…[1]

  • <ul>-仅匹配作为匹配的<h2>的兄弟姐妹的第一个…/li…记住在XPath表达式中索引是基于1的

  • <li>-并匹配属于该<ul>的子项的所有import json MY['Stuff']=[] for k,v in the_dictionary.items(): model = (k) year = (v) MY['Stuff'].append({ "Model": (model), "Year": (year) }) print(MY) print(json.dumps(MY))