#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