XPath for spans在段落后的列表项中

时间:2018-09-04 03:32:10

标签: html xpath

我有以下文档:

var person = new Person 
{
    // populate Person details...
    User = new User
    {
        // populate user details... Don't worry about PersonId...
    }
}
dbContext.Persons.Add(person);
dbContext.SaveChanges();

我正在尝试获取dim rng1 as range, rng2 as range set rng1 = range("b2:c3") set rng2 = range("a1:d4") 'if rng1 is completely within rng2, the intersection's address will be the same as rng1's address if application.intersect(rng1, rng2).address = rng1.address then debug.print rng1.address(0, 0) & " is within " & rng2.address(0, 0) end if 下的所有列表值;但是,XPath在<html> <head> <title>Page</title> </head> <body> <div> <div> <div> </div> <div class="this one"> <p><span><strong>Ignore</strong></span></p> <p>Text</p> <p><span><strong>Header 1</strong></span></p> <ul><li><span style="color: #000;">List Value 1</span></li></ul> <p><span><strong>Header 2</strong></span></p> <ul><li><span style="color: #000;">List Value 2</span></li></ul> <p><span><strong>Ignore</strong></span></p> <ul><li><span style="color: #000;">List Value 3</span></li></ul> <p><span><strong>Header 3</strong></span></p> <ul> <li><span style="color: #000;">List Value A</span></li> <li><span style="color: #000;">List Value B</span></li> <li><span style="color: #000;">List Value C</span></li> </ul> <p><span><strong>Ignore</strong></span></p> <p>Text</p> </div> </div> </div> </body> </html>

之后找不到匹配项

这有效:

Header 3

这不是:

<p>

2 个答案:

答案 0 :(得分:1)

问题是strong后面没有兄弟姐妹ul

更改

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

//div[@class='this one']/p[span='Header 3']/following-sibling::ul[1]/li/span

因为p在同级之后确实有ul。然后选择

<span style="color: #000;">List Value A</span>
<span style="color: #000;">List Value B</span>
<span style="color: #000;">List Value C</span>

根据要求。

答案 1 :(得分:0)

问题是您的XPath表达式一直向下爬到<strong>,它没有任何兄弟姐妹(它是其父<span>元素的唯一子元素)。紧随其后的<ul>兄弟元素是<p>的上一层。

通常,您有两种选择:

  • 先爬下来,然后再备份:

    //div[@class='this one']/p/span/strong[text() = 'Header 3']/../../following-sibling::ul/li/span
    

    ..parent::node()的简写。

  • 使用预表达:

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

    [ ]中的所有内容都是不移动文档树中当前位置的过滤条件。您可以在其中放置任意XPath表达式。在这里,我们使用它来查找包含p的{​​{1}},其中span包含具有给定文本的strong

演示:

function xpath(expr) {
  var found = document.evaluate(expr, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  var results = [];
  for (var i = 0; i < found.snapshotLength; i++) {
    results.push(found.snapshotItem(i));
  }
  return results;
}

console.log(xpath("//div[@class='this one']/p/span/strong[text() = 'Header 3']/../../following-sibling::ul/li/span"));

console.log(xpath("//div[@class='this one']/p[span/strong[text() = 'Header 3']]/following-sibling::ul/li/span"));
<div>
    <div>
        <div>
        </div>
        <div class="this one">
            <p><span><strong>Ignore</strong></span></p>
                <p>Text</p>
            <p><span><strong>Header 1</strong></span></p>
                <ul><li><span style="color: #000;">List Value 1</span></li></ul>
            <p><span><strong>Header 2</strong></span></p>
                <ul><li><span style="color: #000;">List Value 2</span></li></ul>
            <p><span><strong>Ignore</strong></span></p>
                <ul><li><span style="color: #000;">List Value 3</span></li></ul>
            <p><span><strong>Header 3</strong></span></p>
                <ul>
                    <li><span style="color: #000;">List Value A</span></li>
                    <li><span style="color: #000;">List Value B</span></li>
                    <li><span style="color: #000;">List Value C</span></li>
                </ul>
            <p><span><strong>Ignore</strong></span></p>
                <p>Text</p>
        </div>
    </div>
</div>