【问题标题】:How to populate an array with text from html webscraping in ruby如何使用 ruby​​ 中的 html Web 抓取中的文本填充数组
【发布时间】:2017-06-21 06:21:54
【问题描述】:

我已使用 nokogiri ruby​​ gem 为仅 tableData 类下的文本抓取一个 html 文件。 html代码设置如下:

<div class="table-wrap">
   <table class="table">
     <tbody>
        <tr>
           <td class="tableData"> Jane Doe</td>
           <td class="tableData"> 01/01/2017</td>
           <td class="tableData">01/09/2017 </td>
           <td class="tableData">Vacation</td>
        </tr>
        <tr>
           <td class="tableData">John Doe</td>
           <td class="tableData"> 01/01/2017</td>
           <td class="tableData">01/09/2017 </td>
           <td class="tableData">Vacation</td>
        </tr>
     </tbody>
   </table>
</div>

我用来爬网的代码是这样的:

vt = page.css("td[class='tableData']").text
puts vt

给出这个输出:

Jane Doe 01/01/201701/09/2017 VacationJohn Doe 01/01/201701/09/2017 Vacation

我想在一个数组中填充一个数组,其中只包含与每个人相关的 4 个文本值。应该是这样的:

[[Jane Doe, 01/01/2017, 01/09/2017, Vacation], [John Doe, 01/01/2017, 01/09/2017, Vacation]]

我是编码新手,我不确定如何创建一个 for 循环来迭代 html 代码本身或 vt 变量以生成数组数组。我知道在 for 循环之后涉及一些 push 语句,但它是我无法组合起来的 for 循环的实际结构。如果您能在回答中就 for 循环在这种情况下的工作方式提供一些解释,我们将不胜感激。

【问题讨论】:

  • 我认为age.css("td[class='tableData']").map(&amp;:text) 可以做到

标签: html arrays ruby web-scraping arrayofarrays


【解决方案1】:

这是您需要的基本结构。需要map

html=%q(<div class="table-wrap">
   <table class="table">
     <tbody>
        <tr>
           <td class="tableData"> Jane Doe</td>
           <td class="tableData"> 01/01/2017</td>
           <td class="tableData">01/09/2017 </td>
           <td class="tableData">Vacation</td>
        </tr>
        <tr>
           <td class="tableData">John Doe</td>
           <td class="tableData"> 01/01/2017</td>
           <td class="tableData">01/09/2017 </td>
           <td class="tableData">Vacation</td>
        </tr>
     </tbody>
   </table>
</div>)

require 'nokogiri'
doc = Nokogiri::XML(html)
array = doc.xpath('//tr').map do |tr|
  tr.xpath('td').map{ |td| td.text }
end

p array
# [[" Jane Doe", " 01/01/2017", "01/09/2017 ", "Vacation"], ["John Doe", " 01/01/2017", "01/09/2017 ", "Vacation"]]

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

尝试将 sn-p 解析为 XML,通过 XPath 查找所有“tr”元素,并收集它们的“td//text()”子元素:

require 'nokogiri'
doc = Nokogiri::XML(get_html_snippet)
data = doc.xpath('//tr').map do |tr|
  tr.xpath('td').map { |td| td.text.strip }
end
data # => [["Jane Doe", "01/01/2017", "01/09/2017", "Vacation"], ["John Doe", "01/01/2017", "01/09/2017", "Vacation"]]

【讨论】:

  • 哎呀,刚刚看到这和@EricDuminil的一模一样
  • 这也有助于添加的 .strip 清理数组
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2013-07-10
  • 2021-09-02
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多