簡體   English   中英

JSoup解析屬性=“值”=“”

[英]JSoup parse attribute=“value”=“”

我的用例

  1. 從網站下載 HTML 文件
  2. 用 JSoup 解析它
  3. 使用 JSoup 將其轉換為有效的 XML
  4. 使用 XPath (javax.xml.xpath) 從 XML 文檔中讀取元素和屬性

(這在大多數情況下按預期實施和工作。)

問題/原因

有一種情況失敗:

  1. 源 HTML 文件包含無效的內容,例如<div someattribute="somevalue"=""></div>
  2. JSoup 將其轉換為同樣無效的字符串<div someattribute="somevalue" =""=""></div>
  3. XPath 無法解析無效的 JSoup output XML。

問題和解決方法

  1. 是否可以給 JSoup 一個提示,以便它為這個無效輸入生成有效的 output ?
  2. 是否可以給 XPath 一個提示,以便它解析無效輸入(=JSoup 輸出)?
  3. 是的,作為后備,我可以從 HTML 字符串中過濾掉無效的"=""並將其替換為" ,但是當有一個可以解析無效 HTML 的庫時,為什么要自己做呢?

技術細節

不幸的是,我想由 JSoup 解析的 HTML 文檔包含類似以下代碼段的內容:

<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();

...返回包含此代碼段的 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 "/>".

jsoup包含一個到 W3C DOM model 的轉換器,其中包括轉換時的屬性過濾。 然后,您可以直接對該 object 運行 xpath 查詢,這不僅有效,而且比序列化到 XML 然后重新解析更有效。

請參閱org.jsoup.helper.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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM