4

我正在阅读带有 Nokogiri 的本地 HTML 文档,如下所示:

f = File.open(local_xml)
@doc = Nokogiri::XML(f)
f.close

@doc包含一个 Nokogiri XML 对象,我可以使用at_css.

我想使用 Nokogiri 的XML::Node对其进行修改,但我完全被卡住了。如何获取这个 Nokogiri XML 文档并使用节点方法处理它?

例如:

@doc.at_css('rates tr').add_next_sibling(element)

返回:

undefined method `add_next_sibling' for nil:NilClass (NoMethodError)

尽管事实@doc.classNokogiri::XML::Document

为了完整起见,这是我要编辑的标记。

<html>
<head>
<title>Exchange Rates</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <table class="rates">
        <tr>
            <td class="up"><div></div></td>
            <td class="date">Saturday, Jan 12</td>
            <td class="rate up">3.83</td>
        </tr>
        <tr>
            <td class="up"><div></div></td>
            <td class="date">Friday, Jan 11</td>
            <td class="rate up">3.70</td>
        </tr>
        <tr>
            <td class="down"><div></div></td>
            <td class="date">Thursday, Jan 10</td>
            <td class="rate down">3.68</td>
        </tr>
        <tr>
            <td class="down"><div></div></td>
            <td class="date">Wedensday, Jan 9</td>
            <td class="rate down">3.70</td>
        </tr>
        <tr>
            <td class="up"><div></div></td>
            <td class="date">Tuesday, Jan 8</td>
            <td class="rate up">3.66</td>
        </tr>
    </table>
</body>
</html>
4

2 回答 2

3

这是一个如何做你想做的事的例子。从f包含要解析的 HTML 的缩短版本开始:

require 'nokogiri'

f = '
<html>
<head>
<title>Exchange Rates</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <table class="rates">
        <tr>
            <td class="up"><div></div></td>
            <td class="date">Saturday, Jan 12</td>
            <td class="rate up">3.83</td>
        </tr>
    </table>
</body>
</html>
'

doc = Nokogiri::HTML(f)
doc.at('.rates tr').add_next_sibling('<p>foobar</p>')

puts doc.to_html

您的代码错误地尝试class="rates"查找<table>. 在 CSS 中,我们会使用.rates. 使用 CSS 的另一种方法是table[class="rates"].

您的示例未定义您尝试添加到 HTML 的节点,因此我附加了<p>foobar</p>. Nokogiri 将让您从头开始构建一个节点并附加它,或者使用标记并添加它,或者您可以从 HTML 中的一个位置找到一个节点,将其删除,然后将其插入到其他位置。

该代码输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Exchange Rates</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
    <table class="rates">
<tr>
<td class="up"><div></div></td>
            <td class="date">Saturday, Jan 12</td>
            <td class="rate up">3.83</td>
        </tr>
<p>foobar</p>
</table>
</body>
</html>

It's not necessary to use at_css or at_xpath instead of at. Nokogiri senses what type of accessor you're using and handles it. The same applies using xpath or css instead of search. Also, at is equivalent to search('some accessor').first, so it finds the first occurrence of the matching node.

于 2013-01-13T18:26:04.733 回答
2

尝试加载为 HTML 而不是 XMLNokogiri::HTML(f)

没有详细了解 Nokogiri 的工作原理,可以说 XML 没有 css 对吗?所以 at_css 方法没有意义(也许我不知道)。所以它应该可以作为 Html 加载。

更新

只注意到一件事。您想要这样做at_css('.rates tr')at_css('rates tr')因为这就是您在 css 中选择课程的方式。也许它现在适用于 XML。

于 2013-01-13T17:44:10.967 回答