使用Xpath选择具有类名和内部文本的节点

时间:2014-12-23 23:53:07

标签: html xml parsing xpath xml-parsing

我得到了以下(简化)HTML:

    <ul>
        <li class="item c-MessageRow green">
            <div>Hello and </div>
            <div>welcome
                <div> to</div>
            </div>
            <div> my site</div>
        </li>
    </ul>

现在我想选择具有类&#34; c-MessageRow&#34;的li元素。并包含内部文字&#34;欢迎来到我的网站&#34;。

我尝试过以下方法:

//li[contains(@class, 'c-MessageRow') and contains(text(), 'welcome to my site')]

但它什么也没有回报。我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

当你例如将Xpath更改为

//li[contains(@class, 'c-MessageRow') and contains(div/text(), 'Hello')]

//li[contains(@class, 'c-MessageRow') and 
     contains(div/following-sibling::div/text(), 'welcome')]

返回li。 Xpath的问题是,带有c-MessageRow类的li不包含“欢迎访问我的网站”文本,而是包含文本“Hello”的div,另一个{{1} }如果您必须检查div中是否包含全文,或者仅匹配其中的一部分是否足够,则问题是“欢迎”等文本。

评论的

更新:检查课程和li的完整文本可以这样做:

li

//li[contains(@class, 'c-MessageRow') and contains(normalize-space(string(self::li)), 'welcome to my site')] 负责删除任何尾随或前导空格和换行符。这是必要的,因为使用Xpath normalize-space()(结果可能会有所不同,使用在线Xpath测试器测试)看起来像这样:

string(//li)

使用Hello and welcome to my site 会导致:

normalize-space(string(//li))