当前位置: 首页 > 知识库问答 >
问题:

Jsoup解析器问题

罗梓
2023-03-14

我正在使用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>

但是如果“show if”标签包含一个简单的文本,比如你好,它就会像预期的那样工作。

有什么想法吗?谢谢你。

共有2个答案

卞成荫
2023-03-14

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

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

这是因为在

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

如果你真的需要使用非标准的东西来注释你的页面,你可能会在非标准属性上有更好的运气,比如:

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

然后你可以说:元素showif_fields=doc.select("*[show if]");

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

asshowif_fields.outerHtml()

然后,您最好使用另一种方法,例如jQuery模板或Mustache(以及许多其他)之类的javascript模板引擎,它在执行一些逻辑后插入生成的HTML,而不是将内容加载到页面上,然后进行修复。这当然取决于你的要求,我对你的要求了解不够,无法判断这个建议是否合理。编辑:不,这毫无意义,因为Jsoup是服务器端,请参阅下面的注释。

郑衡
2023-03-14

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

在这种情况下,您知道自己在做什么,并且正在创建超文本标记语言,因此您可以设置jSoup忽略超文本标记语言规范,并在看到标签时处理它们。使用XML解析器执行此操作:

Document doc = Jsoup.parse(html, baseUri, Parser.xmlParser());
 类似资料:
  • 我以前问过另一个问题,可以在Jsoup解析HTML问题上看到。我试图解析一个数据值从一个网站到我的android应用程序。我现在意识到,虽然在我的应用程序中,我给出了网页的url和我需要的数据,但当我从我的应用程序连接到url时,它总是连接到网站的登录页面,因此找不到要解析的数据。我在想有没有办法避免这种情况?

  • 我想解析一个HTML表,但我不明白如何获得值。我有这张桌子: 你能为我杀一儆百吗?我要分析此表得所有值...提前谢谢! 编辑:SPAN值:

  • 问题内容: 可供选择(并坚持使用)的大量HTML解析器令人难以置信: http://java-source.net/open-source/html-parsers 如何选择最适合以下要求的产品: 成熟(错误比其他错误少) 生活和呼吸(即得到维持) 快速且资源高效(打算在Android上运行) 根据您的经验,您会推荐哪种HTML解析器(以满足上述要求),为什么? 问题答案: 好吧,我找到了答案,它

  • 问题内容: 在页面中,我想选择一个变量的值。以下是页面的摘要。 我的目的是使用来从此页面读取变量的值。有可能吗?如果是,那怎么办? 问题答案: 由于jsoup不是javascript库,因此有两种方法可以解决此问题: A.使用JavaScript库 优点: 全面的Javascript支持 缺点: 附加的天秤/依赖项 B.使用Jsoup +手动解析 优点: 无需额外的库 足以完成简单的任务 缺点:

  • 我正在尝试使用JSOUP解析来自特定网站的信息。到目前为止,我可以解析和显示单行,因为网站有很多html,我对此很陌生,我想知道有没有一种方法可以解析包含单词“fixturerow”的页面上的所有表行。 下面是我的解析器代码: 谢谢你抽出时间!

  • 主要内容:Jsoup 解析HTML正文 语法,Jsoup 解析HTML正文 说明,Jsoup 解析HTML正文 示例以下示例将展示将 HTML 片段字符串解析为 Element 对象作为 html 正文。 Jsoup 解析HTML正文 语法 document : 文档对象代表 HTML DOM。 Jsoup : 解析给定 HTML 字符串的主类。 html : HTML 片段字符串。 body : 表示文档正文元素的子元素,等效于 document.getElementsByTag("body"