使用Nokogiri::HTML和Ruby进行网页抓取-如何将输出输出到数组中



我刚开始使用nokogiri从网站上抓取信息,不知道如何完成以下工作。我有一些HTML代码要删除:

    <div class="compatible_vehicles">
    <div class="heading">
    <h3>Compatible Vehicles</h3>
    </div><!-- .heading -->
    <ul>
            <li>
        <p class="label">Type1</p>
        <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type2</p>
      <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type3</p>
      <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type4</p>
      <p class="data">All</p>
    </li>
    <li>
        <p class="label">Type5</p>
      <p class="data">All</p>
    </li>
    </ul>
    </div><!-- .compatible_vehicles -->

我已经设法在我的屏幕上得到我想要的输出:

    i = 0
     doc.css('div > .compatible_vehicles > ul > li').each do |item|  
      label = item.at_css(".label").text
      data = item.at_css(".data").text
     print "#{label} - #{data}" + ','
    end  
    i += 1

这给了我一个这样的列表:类型1 -所有,类型2 -所有,类型3 -所有,类型4 -所有,类型5 -所有,在屏幕上

现在我想在数组中获得这个值,以便能够将其保存到CSV文件中。我尝试了几件事,但大多数尝试我得到一个"不能转换字符串到数组"的错误。希望有人能帮我解决这个问题!

从HTML开始:

html = '
<div class="compatible_vehicles">
    <div class="heading">
        <h3>Compatible Vehicles</h3>
    </div><!-- .heading -->
    <ul>
        <li>
        <p class="label">Type1</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type2</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type3</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type4</p>
        <p class="data">All</p>
        </li>
        <li>
        <p class="label">Type5</p>
        <p class="data">All</p>
        </li>
    </ul>
</div><!-- .compatible_vehicles -->
'

用Nokogiri解析它并循环<li>标签以获得它们的<p>标签内容:

require 'nokogiri'
doc = Nokogiri::HTML(html)
data = doc.search('.compatible_vehicles li').map{ |li|
  li.search('p').map { |p| p.text }
}

返回一个数组的数组:

=> [["Type1", "All"], ["Type2", "All"], ["Type3", "All"], ["Type4", "All"], ["Type5", "All"]]

从那里,您应该能够将其插入CSV类的示例中,并使其毫无问题地工作。

现在,将输出到屏幕字段的代码与下面的代码进行比较:

data.map{ |a| a.join(' - ') }.join(', ')
=> "Type1 - All, Type2 - All, Type3 - All, Type4 - All, Type5 - All"

我所要做的是puts,它会正确打印。

考虑返回有用的数据结构真的很重要。在Ruby中,哈希和数组非常有用,因为我们可以对它们进行迭代,并将它们揉成多种形式。从数组的数组中创建散列很简单:

Hash[data]
=> {"Type1"=>"All", "Type2"=>"All", "Type3"=>"All", "Type4"=>"All", "Type5"=>"All"}

这将使查找变得非常容易。

相关内容

  • 没有找到相关文章

最新更新