Использование Nokogiri для разделения содержимого на теги BR
у меня есть фрагмент кода, который я пытаюсь разобрать с nokogiri, который выглядит так:
<td class="j">
<a title="title text1" href="http://link1.com">Link 1</a> (info1), Blah 1,<br>
<a title="title text2" href="http://link2.com">Link 2</a> (info1), Blah 1,<br>
<a title="title text2" href="http://link3.com">Link 3</a> (info2), Blah 1 Foo 2,<br>
</td>
у меня есть доступ к источнику тд.J, используя что-то вроде этого:
data_items = doc.css("td.j")
моя цель-разделить каждую из этих строк на массив хэшей. Единственная логическая точка расщепления, которую я вижу, - это разделить на BRs, а затем использовать некоторое регулярное выражение в строке.
мне было интересно, есть ли лучший способ сделать это, возможно, используя nokogiri только? Даже если я мог бы использовать nokogiri, чтобы высосать 3 строки, это облегчило бы мне работу, так как я мог бы просто сделать разбор регулярных выражений .результат контента.
не уверен, как использовать Nokogiri для захвата строк, заканчивающихся br, хотя-должен ли я использовать xpaths? любое направление ценится! спасибо
2 ответов
если ваши данные действительно являются регулярными, и вам не нужны атрибуты из <a>
элементы, то вы можете проанализировать текстовую форму каждой ячейки таблицы, не беспокоясь о <br>
элементы на всех.
учитывая некоторые HTML, как это в html
:
<table>
<tbody>
<tr>
<td class="j">
<a title="title text1" href="http://link1.com">Link 1</a> (info1), Blah 1,<br>
<a title="title text2" href="http://link2.com">Link 2</a> (info1), Blah 1,<br>
<a title="title text2" href="http://link3.com">Link 3</a> (info2), Blah 1 Foo 2,<br>
</td>
<td class="j">
<a title="title text1" href="http://link4.com">Link 4</a> (info1), Blah 2,<br>
<a title="title text2" href="http://link5.com">Link 5</a> (info1), Blah 2,<br>
<a title="title text2" href="http://link6.com">Link 6</a> (info2), Blah 2 Foo 2,<br>
</td>
</tr>
<tr>
<td class="j">
<a title="title text1" href="http://link7.com">Link 7</a> (info1), Blah 3,<br>
<a title="title text2" href="http://link8.com">Link 8</a> (info1), Blah 3,<br>
<a title="title text2" href="http://link9.com">Link 9</a> (info2), Blah 3 Foo 2,<br>
</td>
<td class="j">
<a title="title text1" href="http://linkA.com">Link A</a> (info1), Blah 4,<br>
<a title="title text2" href="http://linkB.com">Link B</a> (info1), Blah 4,<br>
<a title="title text2" href="http://linkC.com">Link C</a> (info2), Blah 4 Foo 2,<br>
</td>
</tr>
</tbody>
</table>
вы могли бы сделать это:
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
. Затем вы можете преобразовать это в любую хэш-форму, которая вам нужна.
Я не уверен в точке использования массива хэшей, и без примера я не могу что-то предложить. Однако, для разделения текста на <br>
теги, я бы об этом так:
require 'nokogiri'
doc = Nokogiri::HTML('<td class="j">
<a title="title text1" href="http://link1.com">Link 1</a> (info1), Blah 1,<br>
<a title="title text2" href="http://link2.com">Link 2</a> (info1), Blah 1,<br>
<a title="title text2" href="http://link3.com">Link 3</a> (info2), Blah 1 Foo 2,<br>
</td>')
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"}