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

JSoup parse attribute=“value”=“”

佟阳焱
2023-03-14
  1. 从网站下载HTML文件

(在大多数情况下,这是按预期实施和工作的。)

有一个案例失败了:

  1. 源HTML文件包含类似以下内容的无效内容
  1. 有没有可能给JSoup一个提示,让它为这个无效的输入生成有效的输出
  2. 是否可以给XPath一个提示,以便它解析无效的输入(=JSoup output)
  3. 是的,作为回退,我可以从HTML字符串中筛选出无效的“=”,并将其替换为”,但是,当有一个库可以解析无效的HTML时,为什么要自己做呢

不幸的是,我想让JSoup解析的超文本标记语言文档包含这样的片段:

<div someattribute="somevalue"=""></div>

正在使用此配置调用JSoup。。。

Document doc = Jsoup.parse(html);
doc.outputSettings().syntax(Document.OutputSettings.Syntax.xml).charset(StandardCharsets.UTF_8);
String html = doc.html();

...返回包含以下代码段的超文本标记语言文档:

<div someattribute="somevalue" =""=""></div>

然后,XPath将终止解析此文档,并显示以下消息:

Auf Elementtyp "div" müssen entweder Attributspezifikationen, ">" oder "/>" folgen.

在英语中是这样的:

Element type "div" must be followed by either attribute specifications, ">" or "/>".

共有1个答案

张嘉
2023-03-14

jsoup包括一个到W3C DOM模型的转换器,其中包括转换时的属性过滤。然后可以直接在该对象上运行xpath查询,这不仅有效,而且比序列化为XML然后重新解析它更有效。

请参阅org的文档。jsoup。帮手W3CDom

下面是一个例子:

import org.w3c.dom.Document;
import org.w3c.dom.Node;
...

String html = "<div someattribute=\"somevalue\"=\"\"></div>";
org.jsoup.nodes.Document jdoc = Jsoup.parse(html);
Document w3doc = W3CDom.convert(jdoc);

String query = "//div";
XPathExpression xpath = XPathFactory.newInstance().newXPath().compile(query);
Node div = (Node) xpath.evaluate(w3doc, XPathConstants.NODE);

System.out.printf("Tag: %s, Attribute: %s",
        div.getNodeName(),
        div.getAttributes().getNamedItem("someattribute"));

(请注意,DocumentNode这里是W3C DOM,而不是jsoup DOM。)

这给了我们:

Tag: div, Attribute: someattribute="somevalue"
 类似资料:
  • 问题内容: 我需要将参数(POST)传递给@managedBean,我使用了如下托管属性: Bean的范围是ViewScope 我最终遇到此错误: 无法创建托管bean收据。发现了以下问题:-由表达式#{param.id} request引用的对象的范围比引用托管Bean的视图范围要短。 我能做什么? arjan看看: 我的页面:Facelet标题 问题答案: 两种方式: 使bean请求成为作用域

  • 问题内容: 我目前正在使用@Value Spring 3.1.x注释,如下所示: 如果属性不存在,则将空字符串放入变量中。我想将null作为默认值,而不是一个空String。当然,当未设置属性stuff.value时,我也想避免发生错误。 问题答案: 您必须设置PropertyPlaceholderConfigurer的nullValue 。例如,我使用的是字符串,但您也可以将空字符串用作null

  • 问题内容: 我知道该ValueEventListener线程在新线程中运行,是否应该在任何时间删除此线程以进行适当的线程管理?(例如,没有太多并行运行的线程)。如果是,该怎么办? 问题答案: 在谈论监听器时,是的,您需要根据活动的生命周期将其删除,为此,您需要使用以下代码行: 请记住,如果不这样做,最终将浪费您的电池和带宽。所以: 如果已在中添加了侦听器,则onStart必须在中将其删除onSto

  • 问题内容: 和遍历函数之间是否有性能差异? 问题答案: 我认为,由于其高级实现,遍历必须更快 这就是为什么: 让我们逐步执行。 该实施是这样的: 在 从扩展和继承相同的实现。 两者的实现方式不同。 因为它从 但是从 因此, 差异 本质上可以归结为实施。 因为它只是调用e.after,其中e是,但是对于遍历数组以查找下一个下一个要涉及一些工作。 UPDATE :用于在 Entry []不是连续的存储

  • 问题内容: 我有以下配置文件: 我使用以下VM选项运行应用程序: 因此,我希望我的应用程序在启动时加载特定的属性文件。但是由于某些原因,目前未处理注释,属性为。另一方面,如果我已经通过xml文件进行了配置,那么一切都会按预期进行。Xml文件示例: 如果我尝试将属性值注入到另一个Spring配置文件中- 它已正确注入。如果将我的bean创建移动到该配置文件-字段值再次为null。 解决方法是,使用以

  • 问题内容: 我要对Spring-boot进行Junit测试,如下所示: 和ApplicationTest.java这样 和我的POM像这样: 运行测试时,出现以下错误信息 但是当我将此应用程序作为普通Java应用程序运行时 运行良好! 它出什么问题了 ?我应该如何通过Spring-boot进行junit测试?非常感谢! 问题答案: 您需要添加 @PropertySource(“ classpath

  • 问题内容: 我需要重新实现一些枚举的enum.valueof方法,以使它们不再抛出异常,而如果枚举中不存在值,则它们仅返回null。 我正在尝试基本 但是它不起作用,说我需要重写或实现一个超级类型。 我猜想我可以开设一个超级班,但是我不确定如何将它们放在一起。有任何想法吗? 问题答案: 你不能 您必须定义另一个不同的方法。valueOf方法由编译器自动生成。

  • 问题内容: 我有这样的枚举: 有时我需要检查枚举中有多少个字段。最好的解决方案是什么?我应该使用方法“ values()。length”吗?也许,我必须像这样在枚举中创建常量字段: 什么是最快,更优雅的解决方案? 问题答案: 每次调用时,using 将创建该数组的新副本。有时我会创建自己的(或设置或映射,无论需要什么)以避免这种无意义的复制。不过,我 不会对其进行 硬编码…如果您只需要大小,则可以