Jsoup Parser问题

时间:2013-02-09 21:35:39

标签: jsoup

我正在使用Jsoup来解析短html文档,其中包含对结果进行某些逻辑操作所需的一些自定义标记

像这样:

<table><showif field="xxx"><tr><td>test</test></td></tr></showif><tr><td>xyz</td></tr></table>

Document doc = Jsoup.parse(html);
Elements showif_fields = doc.select("SHOWIF[field]");

在这种情况下内部内容似乎丢失了,outerHtml()方法只显示了这个:

<showif value="xxx"></showif>

但是如果“showif”标签包含一个像hello这样的简单文本,它会按预期工作。

有什么想法吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是表格内容的HTML规范非常严格,因此您的未知标记会在表格之外得到培养。 (Jsoup这样做是为了匹配HTML规范,因此它尽可能地匹配浏览器行为。)

在这种情况下,您知道自己在做什么并且正在创建HTML,因此您可以将jsoup设置为忽略HTML规范,并在处理标记时处理它们。使用XML parser

执行此操作
Document doc = Jsoup.parse(html, baseUri, Parser.xmlParser());

答案 1 :(得分:0)

问题是Jsoup已经“清理”了你的HTML。作为一个快速测试,我将您的HTML粘贴到一个页面中并使用我的浏览器进行查看(这也倾向于对其进行消毒)它告诉我HTML实际上是这样的:

<showif value="xxx"/>
<table><tbody><tr><td>test</td></tr><tr><td>xyz</td></tr></tbody></table>

这是因为只有少数元素可以直接放在<table>中,并且浏览器认为您在内置<showif>标记时犯了错误,并为您修复此问题。我认为Jsoup做了类似的事情。

编辑:现在运行Jsoup,如果我查看doc.outerHtml(),它确实会创建类似的输出)

如果您确实需要使用非标准的东西来注释您的网页,那么您可能会更好地使用非标准属性,例如:

<table>
  <tr showif="xxx"><td>test</test></td></tr>
  <tr><td>xyz</td></tr>
</table>

然后你可以说:Elements showif_fields = doc.select("*[showif]");。这会创建

<tr showif="xxx">
   <td>test</td>
</tr>

showif_fields.outerHtml()

那么你可能会采用不同的方法,例如一个javascript模板引擎,如jQuery模板或Mustache(以及许多其他),它在执行某些逻辑后插入生成的HTML,而不是在页面上加载内容并在之后修复它们。这当然取决于您对我不了解的要求,以判断此建议是否有意义。 编辑:不,这没有意义,因为Jsoup是服务器端,请参阅下面的评论。