「小於」(<)isn't legal HTML,但瀏覽器有很多代碼來確定HTML的含義,而不是僅顯示錯誤。這就是爲什麼你的無效HTML樣本在瀏覽器中顯示你想要的樣子。
所以訣竅是確保Nokogiri做同樣的工作來彌補壞的HTML。確保解析該文件作爲HTML而不是XML的:
f = File.open("table.html")
doc = Nokogiri::HTML(f)
此解析您的文件只是罰款,但扔掉了< 1 g
文本。怎麼看待第2種TD元素的內容解析:
doc.xpath('(//td)[1]/text()').to_s
=> "\n "
doc.xpath('(//td)[2]/text()').to_s
=> "0 %"
引入nokogiri拋出了你的無效的文本,但保留解析周圍結構。你甚至可以看到來自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>
是否有任何Ruby包將像TagSoup一樣強大地解析HTML? – sampablokuper 2012-06-13 05:13:23