«Меньше» (<) <a href="http://www.w3schools.com/HTML/html_entities.asp" rel="nofollow noreferrer"> не является допустимым HTML , но браузеры имеют большой код для определения того, что подразумевается под HTML, вместо того, чтобы просто отображать ошибку. Вот почему ваш недопустимый пример HTML отображается так, как вы хотите, чтобы в браузерах.
Так что хитрость заключается в том, чтобы Nokogiri выполнял ту же работу, чтобы компенсировать плохой HTML. Обязательно проанализируйте файл как HTML вместо XML:
f = File.open("table.html")
doc = Nokogiri::HTML(f)
Это нормально разбирает ваш файл, но выбрасывает текст < 1 g
. Посмотрите, как анализируется содержимое первых двух элементов TD:
doc.xpath('(//td)[1]/text()').to_s
=> "\n "
doc.xpath('(//td)[2]/text()').to_s
=> "0 %"
Нокогири выбросил ваш недействительный текст, но продолжал анализировать окружающую структуру. Вы даже можете увидеть сообщение об ошибке от Nokogiri:
doc.errors
=> [#<Nokogiri::XML::SyntaxError: htmlParseStartTag: invalid element name>]
doc.errors[0].line
=> 3
Да, строка 3 плохая.
Похоже, что Nokogiri не имеет такого же уровня поддержки для анализа неверного HTML, как браузеры. Я рекомендую использовать некоторые другие библиотеки для предварительной обработки ваших файлов. Я попытался запустить TagSoup на вашем примере файла, и он исправил <
, изменив его на <
следующим образом:
% java -jar tagsoup-1.1.3.jar foo.html | xmllint --format -
src: foo.html
<?xml version="1.0" standalone="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<table>
<tbody>
<tr>
<th colspan="1" rowspan="1">Total Weight</th>
<td colspan="1" rowspan="1"><1 g</td>
<td colspan="1" rowspan="1" style="text-align: right">0 %</td>
</tr>
<tr>
<td colspan="3" rowspan="1" class="skinny_black_bar"/>
</tr>
</tbody>
</table>
</body>
</html>