- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的 Java 应用程序中,我需要分析 HTML。到目前为止,我一直在使用 JSoup,而且效果非常好。但现在,我需要从 HTML 字符串中获取清理后的文本,此外还需要获取已删除标签的位置。例如,如果我有
Some HTML <b id="boldtext">text</b>
所需的输出是
Some HTML text
以及信息,从位置 10 到 14 有一个 b 标签(我需要标签的位置,就好像那里没有标签一样),并且标签的 id 为“boldtext”。
(我希望我能弄清楚我需要什么,我不太擅长解释 - 它类似于 this 问题,除了我还需要找到的标签的属性,并且它是 Java,而不是 Python)
我想使用 JSoup 来做到这一点,但没有找到一种方法来做到这一点(如果有,请告诉我!)。实现我自己的算法也效果不佳,难以理解并且导致了很多错误。那么,获取所需信息的好方法是什么?有没有办法使用 JSoup 来做到这一点?我需要一个不同的库吗?任何帮助表示赞赏!
**编辑:**我会尝试更清楚地说明我需要什么。在上面的示例中,我需要 HTML 干净的文本以及剩余文本的哪一部分是粗体的信息。我需要开始和结束位置,但 HTML 标记稍后会被删除,因此在搜索正确位置时不能将它们计算在内。
完美的输出将是一个对象列表,其中每个对象包含有关一个标签的信息(我所说的标签是指属于在一起的开始和结束标签):标签类型(例如“b”、“quote”等)、标签内容(没有 HTML)、属性以及标签的开始和结束位置。同样,当我从标签中删除标签时,位置需要保持有效!清理标签后,应用程序仍然需要知道“文本”是粗体,而不是在删除标签之前,结束标签的开头位于 31,因为删除标签时,正确的结束位置向左移动了 17 个字符。
最佳答案
您可以使用正则表达式来查找并替换所有带有空字符串的 HTML 标记。正则表达式匹配器还可以返回匹配组的索引。
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
/** * */
/** * @作者用户 * */公共(public)类 HTMLProcessor {
private Pattern pattern;
private Matcher matcher;
private static final String HTML_PATTERN = "<(\"[^\"]*\"|'[^']*'|[^'\">])*>";
/**
*
*/
public HTMLProcessor() {
pattern = Pattern.compile(HTML_PATTERN);
}
public String Process(String htmlString) {
matcher = pattern.matcher(htmlString);
if (matcher.find()) {
do {
System.out.println("Start:" + matcher.start() + ", end:" + matcher.end());
} while(matcher.find());
return htmlString.replaceAll(HTML_PATTERN, "");
}
return htmlString;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HTMLProcessor processor = new HTMLProcessor();
String output = processor.Process("Some HTML <b id=\"boldtext\">text</b>");
System.out.println(output);
}
}
****编辑****要完成您的要求,JSoup 绝对是正确的方法。但看起来我必须根据您的要求设置整个项目。在这个答案的范围内,我只能给你一些伪代码。
public String processWithJSoup() {
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
Elements tags = doc.getAllElements();
String cleanText = doc.text();
System.out.println(cleanText);
for (Element tag : tags) {
// get node's text
String nodeText = tag.text();
// find node's text position in the cleanText for start and end pos
// get attributes of node
// create a object to hold the above information
// push object into an array
}
return "";
}
关于java - 如何在Java中获取HTML标签的开始和结束位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235885/
我是一名优秀的程序员,十分优秀!