我有一个要在Ruby中解析的HTML文件。 HTML文件非常简单,仅包含标题,链接和段落。我正在使用Nokogiri进行解析。
我正在处理的HTML文件的示例是:
<h1><a id="Dog_0"></a>Dog</h1>
<h2><a id="Washing_dogs_3"></a>Washing Dogs</h2>
<h3>Use soap</h3>
<h2><a id="Walking_dogs_1"></a>Walking Dogs</h2>
我需要将h1
标题作为父项,将h2
标题作为其下的h1
标题的子项,将h3
标题视为其下的h2
标题的子项,等等。>
我想将此信息存储在哈希数组中,这样
[ { h1: "Dog", link: "Dog_0", },{ h1: "Dog", h2: "Washing Dogs", link: "Dog_0#Washing_dogs_3" },{ h1: "Dog", h2: "Washing Dogs", h3: "Use Soap", link: "Dog_0#Washing_dogs_3" },{ h1: "Dog", h2: "Walking Dogs" link: "Dog_0#Walking_dogs_1" }]
由于没有节点嵌套,因此我认为我无法使用任何有用的方法来找到子代。到目前为止,我有:
array_of_records = []; #Store the records in an array desired_headings = ['h1','h2','h3','h4','p'] # headings used to split html into records Dir.glob('*.html') { |html_file| nokogiri_object = File.open(html_file) { |f| Nokogiri::HTML(f, nil, 'UTF-8') } nokogiri_object.traverse { |node| next unless desired_headings.include?(node.name) record = {} record[node.name.to_sym] = node.text.gsub(/[\r\n]/,'').split.join(" ") link = node.css('a')[0] record[:link] = link['id'] if !link.nil? array_of_records << record }
此代码设法捕获我正在解析的标题并将其内容存储为散列为
{heading: "content"}
但未捕获我需要捕获的类似父项的信息。
我有一个要在Ruby中解析的HTML文件。 HTML文件非常简单,仅包含标题,链接和段落。我正在使用Nokogiri进行解析。我是HTML文件的示例...
traverse
是个好主意。您想跟踪最新的h1,h2,h3等:...
因此,我想出了一个最有效的解决方案,除了它不按我的意愿将“记录”存储在我的记录数组中。我的解决方案是