0

<li>生成された HTML ファイルを解析して、最上位の要素を取得したいと考えています。HTML の構造は次のようになります。

<ul>
  <li><a href='#xyz'>toplevel1</a></li>
  <ul>
    <li><a href='#nested11'>nested11</a></li>
    <li><a href='#nested12'>nested12</a></li>
  </ul>
  <li><a href='#xxyyzdf'>toplevel2</a></li>
  <ul>
    <li><a href='#nested21'>nested21</a></li>
    <li><a href='#nested22'>nested22</a></li>
    <li><a href='#nested23'>nested23</a></li>
  </ul>
    ......
</ul> 

私はノコギリが初めてなので、正規表現と少しノコギリを使ってみました。どのリンクがトップレベルのものかを判断する方法が見つかりませんでした。

ページ構成は次のようになります。

<body>
  <div id="content" class="view">
    <div id="main-content" class="wiki-content group">
      <div>
        <ul>
          <li><a href='#YXZ-abd1'>toplevel1</a></li>
          <ul>
            <li><a href='#xyznested11'>nested11</a></li>
            <li><a href='#xyznested12'>nested12</a></li>
          </ul>
          <li><a href='#XZYG-SDF'>toplevel2</a></li>
          <ul>
            <li><a href='#nxyzested21'>nested21</a></li>
            <li><a href='#xyznested22'>nested22</a></li>
            <li><a href='#xyznested23'>nested23</a></li>
          </ul>
          ......
        </ul>
        ......

私の意見では、構造は非常に奇妙です。なぜなら、それは合流点から来る自動生成された HTML だからです。

4

4 に答える 4

1

CSS セレクターを使用して最上位のリンクのみに一致させるために、考えられる唯一のことは、nokogiri で解析しようとしている文字列全体を、別の簡単に選択可能なノードで一時的にラップすることです。

<myselectablenode>
  <ul>
    <li><a href='#top1'>toplevel1</a></li>
    <ul>
      <li><a href='#nested11'>nested11</a></li>
      <li><a href='#nested12'>nested12</a></li>
    </ul>
    <li><a href='#top2'>toplevel2</a></li>
    <ul>
      <li><a href='#nested21'>nested21</a></li>
      <li><a href='#nested22'>nested22</a></li>
      <li><a href='#nested23'>nested23</a></li>
    </ul>
  </ul>
</myselectablenode>

サンプル ドキュメント フラグメントを次のように解析します。doc = Nokogiri::XML::Document.parse("<myselectablenode>" + mydoc + "</myselectablenode>") 次に、トップ レベルの要素にアクセスします。doc.css("myselectablenode > ul > li")

より完全な例を次に示します。

$ cat > /tmp/scrape
  <ul>
    <li><a href='#top1'>toplevel1</a></li>
    <ul>
      <li><a href='#nested11'>nested11</a></li>
      <li><a href='#nested12'>nested12</a></li>
    </ul>
    <li><a href='#top2'>toplevel2</a></li>
    <ul>
      <li><a href='#nested21'>nested21</a></li>
      <li><a href='#nested22'>nested22</a></li>
      <li><a href='#nested23'>nested23</a></li>
    </ul>
  </ul>
^C
~$ irb
irb(main):001:0> contents = File.read("/tmp/scrape")
=> "  <ul>\n    <li><a href='#top1'>toplevel1</a></li>\n    <ul>\n      <li><a href='#nested11'>nested11</a></li>\n      <li><a href='#nested12'>nested12</a></li>\n    </ul>\n    <li><a href='#top2'>toplevel2</a></li>\n    <ul>\n      <li><a href='#nested21'>nested21</a></li>\n      <li><a href='#nested22'>nested22</a></li>\n      <li><a href='#nested23'>nested23</a></li>\n    </ul>\n  </ul>\n"
irb(main):002:0> contents = "<myselectablenode>" + contents + "</myselectablenode>"
=> "<myselectablenode>  <ul>\n    <li><a href='#top1'>toplevel1</a></li>\n    <ul>\n      <li><a href='#nested11'>nested11</a></li>\n      <li><a href='#nested12'>nested12</a></li>\n    </ul>\n    <li><a href='#top2'>toplevel2</a></li>\n    <ul>\n      <li><a href='#nested21'>nested21</a></li>\n      <li><a href='#nested22'>nested22</a></li>\n      <li><a href='#nested23'>nested23</a></li>\n    </ul>\n  </ul>\n</myselectablenode>"
irb(main):003:0> require "rubygems"; require "nokogiri"
=> true
irb(main):004:0> doc = Nokogiri::XML::Document.parse(contents)
=> #<Nokogiri::XML::Document:0x14031ec name="document" children=[#<Nokogiri::XML::Element:0x1402eb8 name="myselectablenode" children=[#<Nokogiri::XML::Text:0x1402c38 "  ">, #<Nokogiri::XML::Element:0x1402be8 name="ul" children=[#<Nokogiri::XML::Text:0x14028f0 "\n    ">, #<Nokogiri::XML::Element:0x14028a0 name="li" children=[#<Nokogiri::XML::Element:0x14025a8 name="a" attributes=[#<Nokogiri::XML::Attr:0x14024cc name="href" value="#top1">] children=[#<Nokogiri::XML::Text:0x1402080 "toplevel1">]>]>, #<Nokogiri::XML::Text:0x1401e78 "\n    ">, #<Nokogiri::XML::Element:0x1401e28 name="ul" children=[#<Nokogiri::XML::Text:0x1401b30 "\n      ">, #<Nokogiri::XML::Element:0x1401ae0 name="li" children=[#<Nokogiri::XML::Element:0x14017e8 name="a" attributes=[#<Nokogiri::XML::Attr:0x140170c name="href" value="#nested11">] children=[#<Nokogiri::XML::Text:0x14012d4 "nested11">]>]>, #<Nokogiri::XML::Text:0x14010cc "\n      ">, #<Nokogiri::XML::Element:0x140107c name="li" children=[#<Nokogiri::XML::Element:0x1400d84 name="a" attributes=[#<Nokogiri::XML::Attr:0x1400ca8 name="href" value="#nested12">] children=[#<Nokogiri::XML::Text:0x1400870 "nested12">]>]>, #<Nokogiri::XML::Text:0x1400668 "\n    ">]>, #<Nokogiri::XML::Text:0x1400500 "\n    ">, #<Nokogiri::XML::Element:0x14004b0 name="li" children=[#<Nokogiri::XML::Element:0x14001b8 name="a" attributes=[#<Nokogiri::XML::Attr:0x14000dc name="href" value="#top2">] children=[#<Nokogiri::XML::Text:0x13ffca4 "toplevel2">]>]>, #<Nokogiri::XML::Text:0x13ffa9c "\n    ">, #<Nokogiri::XML::Element:0x13ffa4c name="ul" children=[#<Nokogiri::XML::Text:0x13ff754 "\n      ">, #<Nokogiri::XML::Element:0x13ff704 name="li" children=[#<Nokogiri::XML::Element:0x13ff40c name="a" attributes=[#<Nokogiri::XML::Attr:0x13ff330 name="href" value="#nested21">] children=[#<Nokogiri::XML::Text:0x13feef8 "nested21">]>]>, #<Nokogiri::XML::Text:0x13fecf0 "\n      ">, #<Nokogiri::XML::Element:0x13feca0 name="li" children=[#<Nokogiri::XML::Element:0x13fe9a8 name="a" attributes=[#<Nokogiri::XML::Attr:0x13fe8cc name="href" value="#nested22">] children=[#<Nokogiri::XML::Text:0x13fe494 "nested22">]>]>, #<Nokogiri::XML::Text:0x13fe28c "\n      ">, #<Nokogiri::XML::Element:0x13fe23c name="li" children=[#<Nokogiri::XML::Element:0x13fdf44 name="a" attributes=[#<Nokogiri::XML::Attr:0x13fde68 name="href" value="#nested23">] children=[#<Nokogiri::XML::Text:0x13fda30 "nested23">]>]>, #<Nokogiri::XML::Text:0x13fd828 "\n    ">]>, #<Nokogiri::XML::Text:0x13fd6c0 "\n  ">]>, #<Nokogiri::XML::Text:0x13fd558 "\n">]>]>
irb(main):005:0> doc.css("myselectablenode > ul > li")
=> [#<Nokogiri::XML::Element:0x14028a0 name="li" children=[#<Nokogiri::XML::Element:0x14025a8 name="a" attributes=[#<Nokogiri::XML::Attr:0x14024cc name="href" value="#top1">] children=[#<Nokogiri::XML::Text:0x1402080 "toplevel1">]>]>, #<Nokogiri::XML::Element:0x14004b0 name="li" children=[#<Nokogiri::XML::Element:0x14001b8 name="a" attributes=[#<Nokogiri::XML::Attr:0x14000dc name="href" value="#top2">] children=[#<Nokogiri::XML::Text:0x13ffca4 "toplevel2">]>]>]
于 2013-07-02T06:02:28.507 に答える
1

ノコギリの逸品をぜひご覧ください。xpathを使用してhtmlを解析できます

require 'nokogiri'

doc = Nokogiri::HTML("<ul>...</ul>")

# Search for nodes by css
doc.css('a[href*=top]').each do |link|
  # do something here
end
于 2013-07-02T05:51:34.053 に答える