2

HTMLからノードを抽出する必要があります(内部テキストではないので、さらに手動で調査するために形式を保持できます)。以下のコードを書きました。しかし、トラバースがどのように機能するかにより、新しいhtmlファイルに重複が生じました。

これは、解析する実際のhtmlです。http://www.sec.gov/Archives/edgar/data/1750/000104746912007300/a2210166z10-k.htm

基本的には、Item10と「登録者の執行役員」の間にある部分を次のItemに抽出する必要があります。項目10はすべての文書に含まれていますが、「登録者の執行役員」はすべての文書に含まれているわけではありません。テーブルを保持したいので、テキストだけでなくノードを取得する必要があります。次のステップでは、これらのセクションにテーブルがある場合は、それらを解析できます。

サンプルhtml:

html = "
<BODY>
<P>Dont need this </P>  
<P>Start</P>
<P>Text To Extract 1 </P>
<P><Font><B>Text to Extract 2 </B></Font></P>
<DIV><TABLE>
<TR>
<TD>Text to Extract 3</TD>
<TD>Text to Extract 4</TD>
</TR>
</TABLE></DIV>
<P>End</P>
</BODY>
"

私は手に入れたい:

html = "
<BODY>
<P>Start</P>
<P>Text To Extract 1 </P>
<P><Font><B>Text to Extract 2 </B></Font></P>
<DIV><TABLE>
<TR>
<TD>Text to Extract 3</TD>
<TD>Text to Extract 4</TD>
</TR>
</TABLE></DIV>
<P>End</P>
</BODY>
"

start_keywordが表示されたら、抽出を開始します。end_keywordが表示されたら、終了して抽出します。

1つのHTMLから抽出する必要のあるセクションが複数あります。キーワードは、異なる名前のノードに表示される場合があります。

doc.at_css('body').traverse do |node|
    inMySection  = false

    if node.text.match(/#{start_keyword}/)
        inMySection = true
    elsif node.text.match(/#{end_keyword}/)
        inMySection = false
    end
    if inMySection
        #Extract the nodes
    end
end

また、次の投稿を参照した後、xpathを使用してこれを達成しようとしましたが成功しませんでした。

XPath軸、次のすべてのノードを取得するまで

特定のタイプの次の兄弟まで、後続のすべての兄弟を検索するXPath

4

1 に答える 1

1

それはノコギリの問題ではなく、あなたのアルゴリズムの問​​題です。フラグinMySectionをループ内に配置しました。つまり、各ステップでフラグを再度設定するfalseと、以前にtrueに設定されていた場合は負けます。

サンプルのHTML入力と出力に基づいて、次のスニペットが機能します。

nodes = Nokogiri::HTML(html)
inMySection  = false
nodes.at_xpath('//body').traverse do |node|
  if node.text.match(/Start/)
    inMySection = true
  elsif node.text.match(/End/)
    inMySection = false
  end
  node.remove unless inMySection
end
print nodes
于 2013-03-03T00:16:03.467 に答える