Не удается извлечь строки таблицы HTML - PullRequest
4 голосов
/ 21 ноября 2011

enter image description here

Я пытаюсь извлечь все пять строк, перечисленных в таблице выше.

Я использую библиотеку Ruby hpricot для извлечения строк таблицы с использованием выражения xpath.

В моем примере используемое выражение xpath - / html / body / center / table / tr. Обратите внимание, что я удалил тег tbody из выражения, что обычно имеет место для успешного извлечения.

Странно то, что я получаю первые три строки в результате, а последние две строки отсутствуют. Я просто понятия не имею, что там происходит.

РЕДАКТИРОВАТЬ: Ничего волшебного в коде, просто прикрепить его по запросу.

require 'open-uri'
require 'hpricot'

faculty = Hpricot(open("http://www.utm.utoronto.ca/7800.0.html"))
(faculty/"/html/body/center/table/tr").each do |text|
  puts text.to_s
end

Ответы [ 2 ]

9 голосов
/ 24 ноября 2011

Недопустимый HTML-документ. (См. http://validator.w3.org/check?uri=http%3A%2F%2Fwww.utm.utoronto.ca%2F7800.0.html.). Hpricot анализирует его не так, как ваш браузер - отсюда и другие результаты - но в этом нельзя винить. До HTML5 не было стандартов о том, как анализировать недействительные документы HTML.

Я попытался заменить Hpricot на Nokogiri, и это, кажется, дает ожидаемый анализ. Код:

require 'open-uri'
require 'nokogiri'

faculty = Nokogiri.HTML(open("http://www.utm.utoronto.ca/7800.0.html"))

faculty.search("/html/body/center/table/tr").each do |text|
  puts text
end

Может быть, вам стоит переключиться?

0 голосов
/ 21 ноября 2011

Путь table/tr не существует. Это table/tbody/tr или table//tr. Когда вы используете table/tr, вы специально ищете <tr>, который является прямым потомком <table>, но по вашему изображению это не то, как разметка структурирована.

...