[英]Are there any Java HTML parsers where the generated Nodes retain indexes to the original text?
我想將HTML文檔作為XML查詢(例如使用XPath),因此我需要通過某種形式的HTML清理器傳遞HTML。
但我還想根據查詢結果修改原始源字符串。
是否有一個Java HTML解析器保留了原始源字符串的索引,所以我可以找到一個節點並修改原始字符串的正確部分?
干杯。
聽起來傑里科幾乎就是你想要的。 它是一個強大的HTML解析器,專門用於對源文檔進行非侵入式修改。
雖然它沒有DOM,SAX或StAX接口,但它具有與那些標准相似的自定義API,您應該能夠相當容易地調整您的方法,或者在您正在使用的任何內容之間編寫適配器。傑里科。 例如,您可以使用Jaxen對Jericho文檔執行XPath查詢 - 請參閱此博客條目以獲取示例。
Jericho具有每個元素的開始和結束屬性,甚至對於元素的部分內容,如標記名稱甚至屬性名稱,因此您可以使用該信息自行編輯文檔,但Jericho真正發光的是OutputDocument類,它讓您通過使用與您的查詢匹配的Jericho元素調用適當的方法直接指定替換,而不必在它們上顯式調用getBegin()和getEnd()並將其傳遞給某些替換方法。
我們使用jericho html解析器來進行解析和htmlcleaner來進行實際的清理。
我們修復了服務器應用程序(內存管理,日志記錄)中jericho的行為問題。 (原始開發人員認為我們的問題不夠重要,無法放入主代碼分支)。 我們的fork在github上。 我們還修復了htmlcleaner 。
我不知道“保留原始文本的索引”部分,但傑里科是一個非常好的HTML解析器庫。
以下是如何從html中刪除每個跨度的示例:
public static String removeSpans(String html) {
Source source = new Source(html);
source.fullSequentialParse();
OutputDocument outputDocument = new OutputDocument(source);
List<Tag> tags = source.getAllTags();
for (Tag tag : tags) {
String tagname = tag.getName().toLowerCase();
if (tagname.equals("span")) {
//remove the <span>
outputDocument.remove(tag);
}
}
return outputDocument.toString();
}
我想你可以使用HTML Parser 。
您可以使用類Node中的 getStartPosition()和getEndPosition()來獲取原始頁面的索引。
這很棒
例
Tidy tidy = new Tidy(); // obtain a new Tidy instance
tidy.setXHTML(boolean xhtml); // set desired config options using tidy setters
... // (equivalent to command line options)
tidy.parse(inputStream, System.out);
為了抓取DOM,我建議使用JDOM,它比簡單的XML更快。
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("root");
Text text = doc.createText("This is the root");
root.appendChild(text);
doc.appendChild(root);
就實現而言,我將創建一個新文檔,並從源添加節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.