【问题标题】:Parsing multiple lists in HTML file with Nokogiri使用 Nokogiri 解析 HTML 文件中的多个列表
【发布时间】:2014-11-18 08:01:30
【问题描述】:

我正在尝试使用 Ruby 学习脚本,这是我的第一个问题。

我有一个包含州及其城市的 HTML 文件。我需要能够访问这些城市并在我的 Ruby 代码中知道它们属于哪个州,所以我计划解析 HTML 并为每个城市创建一个哈希,如下所示:{New York => New York City }.

我正在尝试使用 Nokogiri,我现在正在学习。

  <h4>State</h4>
  <ul>
    <li>city</li>
    <li>city</li>
    <li>city</li>
  </ul>
  <h4>State</h4>
  <ul>
    <li>city</li>
    <li>city</li>
    <li>city</li>
  </ul>
  <h4>State</h4>
  <ul>
    <li>city</li>
    <li>city</li>
    <li>city</li>
  </ul>

我正在使用它来将状态放入一个数组中:

require 'rubygems'
require 'nokogiri'

page = Nokogiri::HTML(open("to_parse.html"))

states = Array.new(100), index = 0

page.css('h4').each do |s|

    states[index]   = s.text
    puts states[index]

    index += 1
end

这实际上并没有帮助;我需要弄清楚如何让Nokogiri 将每个列表的元素解析为包含城市及其州的hashes。我不确定当它完成一个州的城市列表时如何进行循环中断,并为下一个州的城市列表创建一组新的hashes

我想我必须为每个列表元素创建一个hash,并将该列表的h4 标记的文本存储在每个hash 中,这样我就知道该城市属于哪个州。我不知道该怎么做。

请随意提供一些关于重构我所拥有的东西的建议,因为我知道它可以做得更好。

【问题讨论】:

    标签: ruby hash html-parsing nokogiri


    【解决方案1】:

    XPath 选择器可以在这里为您提供帮助。

    states = doc.css('li').map do |city|
      state = city.xpath('../preceding-sibling::h4[1]')
      [city.text, state.text]
    end.to_h
    
    #=> {'city' => 'State', ...}
    

    这会抓取所有li city 元素,然后追溯到它们的状态。 (XPath 如下所示:.. = 上一级,preceding-sibling::h4 = 前面的 h4 元素,[1] = 第一个这样的元素)

    您的代码中的一些 cmets:在 Ruby 中,您不需要初始化数组,而使用 Enumerable 方法,如 map,您永远不需要在循环中跟踪索引变量。

    请注意,最后的 to_h 仅适用于 Ruby 2.1 或更高版本。

    【讨论】:

    • 谢谢,完美运行。是的,我认为我没有使用正确的迭代类型。感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2012-02-03
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多