有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

是否存在生成的节点保留原始文本索引的Java HTML解析器?

我希望以XML形式查询HTML文档(例如使用XPath),因此我需要通过某种形式的HTML清理器传递HTML

但是我还想根据查询结果修改原始源字符串

是否有一个Java HTML解析器保留原始源字符串的索引,这样我就可以找到一个节点并修改原始字符串的正确部分

干杯


共 (6) 个答案

  1. # 1 楼答案

    听起来杰里科几乎就是你想要的。它是一个健壮的HTML解析器,专门设计用于对源文档进行非侵入性修改

    虽然它没有DOM、SAX或StAX接口,但它有定制的API,这些API与这些标准非常相似,您应该能够相当轻松地调整方法以适应它们,或者在您正在使用的任何东西和Jericho之间编写适配器。例如,可以使用Jaxen对Jericho文档进行XPath查询——请参见this blog entry以获取示例

    Jericho对每个元素都有begin和end属性,甚至对于元素的某些部分,比如标记名,甚至属性名,所以你可以用这些信息自己编辑文档,但Jericho真正的亮点是OutputDocument类,它允许您通过使用与查询匹配的Jericho元素调用适当的方法来直接指定替换,而不必显式地调用getBegin()和getEnd(),并将其传递给某个替换方法

  2. # 2 楼答案

    我不知道“保留原始文本的索引”部分,但是Jericho是一个非常好的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();
    }
    
  3. # 3 楼答案

    这很有效

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

    就实现而言,我将创建一个新文档,并从源代码向其中添加节点

  4. # 5 楼答案

    正如其他人所建议的,您可能希望呈现DOM。这基本上只是意味着构建节点树,它不会改变文档源,除非您使用像jTidy这样的HTML清理程序。这样您就可以轻松访问该文档,并可以根据需要对其进行修改。我建议DOM4J,它也有很好的api和xpath支持

    根据“索引”要求,在遍历/查询文档的过程中,您可以在列表中缓存或映射任何元素或节点,以便在以后修改其文本