代码之家  ›  专栏  ›  技术社区  ›  Matrix

使用mechanize获取以下特定标签?(红宝石)

  •  1
  • Matrix  · 技术社区  · 8 年前

    如何获得以下所有元素一次,例如:

    <div id="exemple">
      <h2 class="target">foo</h2>
      <p>bla bla</p>
      <ul>
        <li>bar1</li>
        <li>bar2</li>
        <li>bar3</li>
      </ul>
      <h4>baz</h4> 
      <ul>
         <li>lot</li>
      </ul>
      <div>of</div>
      <p>possible</p>
      <p>tags</p>
      <a href="#">after</a>
    </div>
    

    <h2 class="target"> 并将所有标签转移到下一个 <h4> 并忽略 <h4> 以下所有标签(如果 <h4> 不存在,我必须将所有标签都放在父项的末尾[此处:结束 <div> ])

    内容动态且不可预测

    <h2 class="target">foo</h2>
    <p>bla bla</p>
    <ul>
      <li>bar1</li>
      <li>bar2</li>
      <li>bar3</li>
    </ul>
    

    target = page.at('#exemple .target') 我知道 next_sibling 方法,但如何测试当前节点的标记类型?

    我想用这样的方法来处理节点树:

    html = ''
    while not target.is_a? 'h4'
      html << target.inner_html
      target = target.next_sibling
    

    2 回复  |  直到 8 年前
        1
  •  2
  •   pguardiario    8 年前

    h2 = page.at('h2')
    (h2.search('~ *') - h2.search('~ h4','~ h4 ~ *')).each do |el|
        # el is not a h4 and does not follow a h4
    end
    

    也许使用xpath更有意义,但我可以不用谷歌搜索。

    您迭代下一个兄弟的想法也可以奏效:

    el = page.at('h2 ~ *')
    while el && el.name != 'h4'
        # do something with el
        el = el.at('+ *')
    end
    
        2
  •  1
  •   Mark Thomas    8 年前

    h2 h4 ; 如果您想保留它,XPath将是:

    //h2[@class="target"] | //h2[@class="target"]/following-sibling::*
    

    h4 :

    //h2[@class="target"] | //h2[@class="target"]/following-sibling::*[not(self::h4)]
    

    编辑 h4 除此之外:

    //h2[@class="target"] | //h2[@class="target"]/following-sibling::*[not(self::h4) | not(preceding-sibling::h4)]