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.classであるにも関わらずNokogiri::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>

の代わりにat_cssorを使用する必要はありません。Nokogiri は、使用しているアクセサーの種類を感知して処理します。の代わりにorを使用しても同じことが言えます。また、は と同等であるため、一致するノードの最初のオカレンスを見つけます。at_xpathatxpathcsssearchatsearch('some accessor').first

于 2013-01-13T18:26:04.733 に答える
2

XML ではなく HTML としてロードしてみてくださいNokogiri::HTML(f)

Nokogiri がどのように機能するかについては詳しく説明しませんが、XML には css がありません。したがって、メソッド at_css は意味がありません (おそらく意味がわかりません)。したがって、Htmlとしてロードする必要があります。

アップデート

ただ一つ気づいた。それがcssでクラスを選択する方法であるため、代わりに実行したいのat_css('.rates tr')です。at_css('rates tr')多分それは今XMLで動作します。

于 2013-01-13T17:44:10.967 に答える