如何使用 Nokogiri 解析此 HTML?

发布于 2025-01-07 04:19:00 字数 2888 浏览 2 评论 0原文

我有一个像这样的 HTML 文档:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Page Title</title>
<style type="text/css">
</style>
</head>
<body>

<div class="section">
    <table>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
    </table>
</div>

<div class="section">
    <table>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
    </table>
</div>

<div class="section">
    <table>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
    </table>
</div>

</body>
</html>

我想获取第一行和第二行的所有行中的前两个 td 元素 第三个 table 元素。如何得到这个结果呢?

请注意,两个td 一行中的元素有一定的关系,你不能对待所有td 元素同样的方式。例如,如何连接内容 连续两个 td 元素?

I have an HTML document like this:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Page Title</title>
<style type="text/css">
</style>
</head>
<body>

<div class="section">
    <table>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
    </table>
</div>

<div class="section">
    <table>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>test</td><td>test</td><td>test</td><td>test</td>
        </tr>
    </table>
</div>

<div class="section">
    <table>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
        <tr>
            <td>this_is_what_i_want</td><td>this_is_what_i_want</
td><td>test</td><td>test</td>
        </tr>
    </table>
</div>

</body>
</html>

I want to get the first two td elements in all rows of the first and
third table element. How to get this result?

Note that the two td
elements in a row have some relation and you can't treat all td
elements the same way. For example, how do I concatenate the content of
the two td elements in a row?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

漫漫岁月 2025-01-14 04:19:00
doc.xpath('//div[position()=1 or position()=3]/table/tr').map{|tr| tr.css('td')[0..1].map(&:text).join(' ')}
doc.xpath('//div[position()=1 or position()=3]/table/tr').map{|tr| tr.css('td')[0..1].map(&:text).join(' ')}
白衬杉格子梦 2025-01-14 04:19:00

它还可以使用两个 XPath 语句来完成:

doc.xpath('//div[position()=1 or position()=3]/table/tr').map {|row| row.xpath('concat(//td[1]," ",//td[2])')}

不能在单个 XPath 语句中完成的原因是 String XPath 函数仅在节点集的第一个节点上工作。您可以进行节点选择或串联,但不能同时进行两者。

请注意,在 XPath 2.0 中,可以使用 string-join() 函数来完成,但 Nokogiri 仅支持 XPath 1.0。

It can also be done using two XPath statements:

doc.xpath('//div[position()=1 or position()=3]/table/tr').map {|row| row.xpath('concat(//td[1]," ",//td[2])')}

The reason it can't be done in a single XPath statement is that the String XPath functions work on the first node of a nodeset only. You can do node selection or concatenation but not both.

Note that in XPath 2.0, it can be done using the string-join() function but Nokogiri supports only XPath 1.0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文