簡體   English   中英

是否有任何Java HTML解析器,其中生成的節點保留原始文本的索引?

[英]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()來獲取原始頁面的索引。

正如其他人所建議的那樣,您可能想要渲染DOM。 這基本上只是意味着構建節點樹,它不會改變文檔源,除非你使用像jTidy這樣的HTML清理器。 然后,您可以輕松訪問該文檔,並可以根據需要進行修改。 我建議使用DOM4J ,它也有很好的api和xpath支持。

重新編寫“索引”要求,在遍歷/查詢文檔期間,您可以在列表中緩存或映射您希望稍后修改文本的任何元素或節點。

這很棒

http://jtidy.sourceforge.net/

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更快。

http://www.jdom.org/

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

就實現而言,我將創建一個新文檔,並從源添加節點。

您可以嘗試使用HTML語法的 ANTLR

您可以采用(至少)2種方法 - 嘗試將其用作實際的HTML解析器,然后將索引轉換為您感興趣的原始字符串。

或者,它還具有對源文本進行就地轉換的內置支持,您可以在其中定義要作為語法的一部分對文本執行的轉換。

暫無
暫無

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

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