[英]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.