【问题标题】:Mechanize page.search based on adjacent tags机械化 page.search 基于相邻标签
【发布时间】:2015-10-15 09:49:28
【问题描述】:

我需要抓取一个没有定义太多类的页面,以便我将信息组合在一起。

这显示了我要抓取的内容:

<h2 class="header">
    <a class="header" href="index.php?id=45>Product 1</a>
</h2>
<p>There are no active items attached to this product.</p>

<h2 class="header">
    <a class="header" href="index.php?id=43">Product 2</a>
</h2>

<table class="description_header" cellspacing="0">
    <tbody>
        <tr>
            <td> ... </td>
        </tr>
    </tbody>
</table>

<div class="subbar"></div>

<table class="tablehandler_list" cellspacing="0">
    <tbody>
        <tr>
            <th> Col 1 </td>
            <th> Col 2 </td>
            <th> Col 3 </td>
            <th> Col 4 </td>
        </tr>
        <tr>
            <td> Info 1 </td>
            <td> Info 2 </td>
            <td> Info 3 </td>
            <td> Info 4 </td>
        </tr>
    </tbody>
</table>

我的产品标题下没有任何内容,而产品标题则包含与之关联的数据。

我使用带有 mongoid 的 Rails 4,目标是使用上述数据创建一个哈希,如下所示:

{"Product" => "Product 1"}  
{"Product" => "Product 2", "Col 1" => "Info 1", "Col 2" => "Info 2", "Col 3" => "Info 3"} 

我虽然 CSS 相邻兄弟选择器可以帮助我,它确实有助于找到正确的标题,但它只返回第二个标签。如果我使用

page.search("h2.header + p")

它只会给我&lt;p&gt; 标签,我也想从h2.header 了解产品。

有没有一种方法可以为我提供同一级别的下一个标签?例如,这样我可以查找带有page.search("h2.header") 的标题,然后检查后面的标签。

【问题讨论】:

  • Nokogiri 的文档解释了这一切,尤其是“Nokogiri::XML::Node”文档。
  • 好的,谢谢。不久前,我在 Nokogiri 文档中发现了这一点以及更多内容。阅读完所有这些后,我的问题似乎很愚蠢。我将发布一个简化的答案。

标签: ruby-on-rails web-scraping mechanize


【解决方案1】:

我想我的问题是我在谷歌上搜索有关 Mechanise 而不是 Nokogiri 的问题的答案。

我的解决方案的一个非常简化的版本如下:

doc = Nokogiri::HTML(html)
products = Hash.new
products["Products"] = {}
headers = Array.new
tmp_prods = Hash.new
h2 = doc.xpath('//h2[@class="header"]').reject {|i| i.next.name == "p"}
h2.map do |e|
    products["Products"][e.text] = {}
    e.next.next.next.xpath('./tbody/tr/th').map {|th| headers.push( th.text.strip ) }
    e.next.next.next.xpath('./tbody/tr/td').map.with_index {|td, index| tmp_prods[headers[index]] = td.text.strip }
    products["Products"][e.text].merge!(tmp_prods)
end

我以散列结尾:

产品 => {"Products"=>{"Product 2"=>{"Col 1"=>"Info 1", "Col 2"=>"Info 2", "Col 3"=>"Info 3", " Col 4"=>"信息 4"}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多