使用Nokogiri在BR标签上拆分内容

我有一段代码我试图用nokogiri解析,看起来像这样:

 Link 1 (info1), Blah 1,
Link 2 (info1), Blah 1,
Link 3 (info2), Blah 1 Foo 2,

我可以使用以下内容访问td.j的源: data_items = doc.css("td.j")

我的目标是将每个行分成一个哈希数组。 我能看到的唯一逻辑分裂点是拆分BR,然后在字符串上使用一些正则表达式。

我想知道是否有更好的方法来做这个可能只使用nokogiri? 即使我可以使用nokogiri来吸取3行项目,它也会让我更容易,因为我可以在.content结果上进行一些正则表达式解析。

不知道如何使用Nokogiri抓住以br结尾的行 – 我应该使用xpath吗? 任何方向表示赞赏! 谢谢

如果您的数据确实是常规的,并且您不需要元素中的属性,那么您可以解析每个表格单元格的文本forms,而不必担心
元素。

html给出了一些这样的html

 
Link 1 (info1), Blah 1,
Link 2 (info1), Blah 1,
Link 3 (info2), Blah 1 Foo 2,
Link 4 (info1), Blah 2,
Link 5 (info1), Blah 2,
Link 6 (info2), Blah 2 Foo 2,
Link 7 (info1), Blah 3,
Link 8 (info1), Blah 3,
Link 9 (info2), Blah 3 Foo 2,
Link A (info1), Blah 4,
Link B (info1), Blah 4,
Link C (info2), Blah 4 Foo 2,

你可以这样做:

 chunks = doc.search('.j').map { |td| td.text.strip.scan(/[^,]+,[^,]+/) } 

有这个:

 [ [ "Link 1 (info1), Blah 1", "Link 2 (info1), Blah 1", "Link 3 (info2), Blah 1 Foo 2" ], [ "Link 4 (info1), Blah 2", "Link 5 (info1), Blah 2", "Link 6 (info2), Blah 2 Foo 2" ], [ "Link 7 (info1), Blah 3", "Link 8 (info1), Blah 3", "Link 9 (info2), Blah 3 Foo 2" ], [ "Link A (info1), Blah 4", "Link B (info1), Blah 4", "Link C (info2), Blah 4 Foo 2" ] ] 

chunks 然后你可以将它转换为你需要的任何哈希forms。

我不确定使用散列数组的意义,如果没有示例,我无法提出建议。 但是,为了在
标签上拆分文本,我会这样做:

 require 'nokogiri' doc = Nokogiri::HTML(' Link 1 (info1), Blah 1,
Link 2 (info1), Blah 1,
Link 3 (info2), Blah 1 Foo 2,
') doc.search('br').each do |n| n.replace("\n") end doc.at('tr.j').text.split("\n") # => ["", " Link 1 (info1), Blah 1,", "Link 2 (info1), Blah 1,", "Link 3 (info2), Blah 1 Foo 2,"]

这将使您更接近哈希:

 Hash[*doc.at('td.j').text.split("\n")[1 .. -1].map{ |t| t.strip.split(',')[0 .. 1] }.flatten] # => {"Link 1 (info1)"=>" Blah 1", "Link 2 (info1)"=>" Blah 1", "Link 3 (info2)"=>" Blah 1 Foo 2"}