очистка HTML-таблицы ruby nokogiri с использованием xpath

#html #ruby #xpath #html-table #nokogiri

#HTML #ruby #xpath #html-таблица #nokogiri

Вопрос:

Я пытаюсь получить значение «cell4», которое записано в HTML-таблице, подобной следующей, используя ruby xpath и nokogiri:

 <html>
<body>

<h1>Heading</h1>

<p>paragraph.</p>

<h4>Two rows and three columns:</h4>
<table border="0">
<tr>
  <td>cell1</td>
  <td>cell2</td>
</tr>
<tr>
  <td>cell3</td>
  <td>cell4</td>
</tr>

</table>

</body>
</html>
  

У меня есть следующий простой код, но он приносит []. Этот вопрос должен быть достаточно простым, но не смог найти ничего, что попадает в точку в Google

 #!/usr/bin/ruby -w

require 'rubygems'
require 'nokogiri'

page1 = Nokogiri::HTML('test_simple.html')

a = page1.xpath("//html/body/table/tr[2]/td[2]")
p a
  

xpath работает так, как задумано, на REXML, следовательно, это правильно, но не на nokogiri. Поскольку это будет использоваться для больших html’ов, REXML нельзя использовать. Проблема, похоже, не только в таблицах, только в другом содержимом тега

или также не может быть очищена.

Комментарии:

1. это должно быть Nokogiri::HTML(open('test_simple.html'))

2. это возвращает что-то вроде [#<Nokogiri::XML::Element: 0x3fb571a59220 name=»h1″ children = [#<Nokogiri::XML::Text:0x3fb571a58fa0 «Заголовок»>]>], значение которого затем извлекается с помощью .text в конце инструкции xpath ../. спасибо!!!

3. Предполагая, что вы запускаете IRB из каталога, в котором ‘test_simple.html ‘ файл находится примерно так: Nokogiri::HTML(open("test_simple.html")).at_xpath("//html/body/table/tr[2]/td[2]").text должен дать вам то, что вы ищете.

Ответ №1:

ИМХО, работать с CSS API в Nokogiri намного проще (XPath всегда вызывает у меня головную боль):

 page.css('td') # should return an array of 4 table cell nodes
page.css('td')[3] # return the 4th 'td' node, counting starts at 0
  

Ответ №2:

благодаря комментарию Таро я смог решить проблему с небольшими усилиями

Вот правильный код:

 #!/usr/bin/ruby -w
require 'rubygems'
require 'nokogiri'
page1 = Nokogiri::HTML(open('test_simple.html'))
a = page1.xpath("/html/body/table/tr[2]/td[2]").text
p a