html – Nokogiri和Xpath:找到两个标签之间的所有文本

前端之家收集整理的这篇文章主要介绍了html – Nokogiri和Xpath:找到两个标签之间的所有文本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不确定这是语法问题还是版本差异,但我似乎无法解决这个问题.我想从h2标签中取出(非关闭)td内的数据到h3标签.以下是HTML的外观.
<td valign="top" width="350">
    <br><h2>NameIWant</h2><br>
    <br>Town<br>

    PhoneNumber<br>
    <a href="mailto:emailIwant@nowhere.com" class="links">emailIwant@nowhere.com</a>
    <br>
    <a href="http://websiteIwant.com" class="links">websiteIwant.com</a>
    <br><br>    
    <br><img src="images/spacer.gif"/><br>

    <h3><b>I want to stop before this!</b></h3>
    Lorem Ipsum Yadda Yadda<br>
    <img src="images/spacer.gif" border="0" width="20" height="11" alt=""/><br>
    <td width="25">
        <img src="images/spacer.gif" border="0" width="20" height="8" alt=""/>
        <td valign="top" width="200"><img src="images/spacer.gif"/>
            <br>
            <br>

            <table cellspacing="0" cellpadding="0" border="0"/>205"&gt;<tr><td>
                <a href="http://dontneedthis.com">
                </a></td></tr><br>
            <table border="0" cellpadding="3" cellspacing="0" width="200">
            ...

< td valign>直到页面的最底部关闭,我认为这可能是我遇到问题的原因.

我的Ruby代码看起来像:

require 'open-uri'
require 'nokogiri'

@doc = Nokogiri::XML(open("http://www.url.com"))

content = @doc.css('//td[valign="top"] [width="350"]')

name = content.xpath('//h2').text
puts name // Returns NameIwant

townNumberLinks = content.search('//following::h2')
puts content // Returns <h2> NameIWant </h2>

据我所知,遵循语法应该“在当前节点的结束标记之后选择文档中的所有内容”.如果我尝试使用前面的:

townNumberLinks = content.search('//preceding::h3')
// I get: <h3><b>I want to stop before this!</b></h3>

希望我明确表达了我想要做的事情.谢谢!

解决方法

这不是微不足道的.在您选择的节点(td)的上下文中,要获取两个元素之间的所有内容,您需要执行这两个集合的交集:

>集合A:第一个h3之前的所有节点:// h3 [1] / preceding :: node()
> Set B:第一个h2:// h2 [1] / following :: node()之后的所有节点

要执行交叉路口,您可以使用Kaysian method(Michael Kay之后,谁提出它).基本公式是:

A[count(.|B) = count(B)]

将它应用于您的集合,如上所定义,其中A = // h3 [1] / preceding :: node()和B = // h2 [1] / following :: node(),我们有:

//h3[1]/preceding::node()[ count( . | //h2[1]/following::node()) = count(//h2[1]/following::node()) ]

这将选择从第一个< br>开始的所有元素和文本节点.在< / h2>之后标记,到最后一个< br>之后的空白文本节点,就在下一个< h3>之前.标签.

您可以轻松选择h2和h3之间的文本节点,替换表达式中text()的node().这个将返回两个标头之间的所有文本节点(包括空格和换行符):

//h3[1]/preceding::text()[ count( . | //h2[1]/following::text()) = count(//h2[1]/following::text()) ]
原文链接:/html/231304.html

猜你在找的HTML相关文章