Java 在两个文本之间提取文本<;人力资源>;无CSS HTML中的标记

Java 在两个文本之间提取文本<;人力资源>;无CSS HTML中的标记,java,html-parsing,jsoup,Java,Html Parsing,Jsoup,使用Jsoup,提取文本的最佳方法是什么?它的模式是已知的([number]%[number]),但驻留在一个既不使用CSS也不使用div、span、class或其他任何类型标识的HTML页面中(是的,我无法控制的旧HTML页面) 唯一一致地标识该文本段(并保证保持不变)的是,HTML总是这样(在更大的HTML主体中): 2%%17 (数字2和17只是示例。它们可以是任何数字,事实上,这是我需要从HTML页面可靠提取的两个变量) 如果该文本在一个封闭的、唯一标识的或中,那么使用Jsoup提

使用Jsoup,提取文本的最佳方法是什么?它的模式是已知的(
[number]%[number]
),但驻留在一个既不使用CSS也不使用div、span、class或其他任何类型标识的HTML页面中(是的,我无法控制的旧HTML页面)

唯一一致地标识该文本段(并保证保持不变)的是,HTML总是这样(在更大的HTML主体中):


2%%17
(数字2和17只是示例。它们可以是任何数字,事实上,这是我需要从HTML页面可靠提取的两个变量)

如果该文本在一个封闭的、唯一标识的
中,那么使用Jsoup提取它就不会有问题。问题是,情况并非如此,我现在能想到的唯一方法(一点也不优雅)是通过正则表达式处理原始HTML

然而,通过正则表达式处理原始HTML似乎效率低下,因为我已经通过Jsoup将其解析为DOM

建议?

这个怎么样

Document document = Jsoup.connect(url).get();
Elements hrs = document.select("hr");
Pattern pattern = Pattern.compile("(\\d+%%\\d+)");

for (Element hr : hrs) {
    String textAfterHr = hr.nextSibling().toString();
    Matcher matcher = pattern.matcher(textAfterHr);

    while (matcher.find()) {
        System.out.println(matcher.group(1)); // <-- There, your data.
    }
}
documentdocument=Jsoup.connect(url.get();
元素hrs=文件。选择(“hr”);
Pattern=Pattern.compile(“(\\d+%\\d+”);
用于(要素小时数:小时){
字符串textAfterHr=hr.nextSibling().toString();
Matcher Matcher=pattern.Matcher(textAfterHr);
while(matcher.find()){

System.out.println(matcher.group(1));//您试过调试jsoup元素以查看元素是否在那里吗?@ariel是的,元素在那里,但它们不是“封闭元素”,因此我不能真正使用
元素.text()
来获得备受垂涎的
[number]%[number]
:@ariel问题是
[number]%[number]
不是元素。因此,目前我的解决方法是采用
body.html()
并将其传递给一个识别上述模式的正则表达式。但我对更优雅的解决方案持开放态度。因此元素不在那里。它不是作为元素解析的,它只在主体上。该模式在HTML中出现多次?还是只出现一次?在这个解决方案中肯定有更多的jsoup,但因为它无论如何都必须求助于正则表达式,现在的问题是通过正则表达式传递body.HTML()是否会更快。您正在文本节点中寻找模式。Jsoup不能为您做太多,因为它不是正则表达式匹配器。当然。但我现在很好奇,通过hrs循环是否比顶级正则表达式更快。类似(
)\s*(\d+)%(\d+)\s*(
)如果要匹配的字符串尽可能小,则Regex至少会更快。将整个文档传递给它,而不是只传递尽可能小的片段,因为您确信它可以包含您要查找的数据,这将更加昂贵。
Document document = Jsoup.connect(url).get();
Elements hrs = document.select("hr");
Pattern pattern = Pattern.compile("(\\d+%%\\d+)");

for (Element hr : hrs) {
    String textAfterHr = hr.nextSibling().toString();
    Matcher matcher = pattern.matcher(textAfterHr);

    while (matcher.find()) {
        System.out.println(matcher.group(1)); // <-- There, your data.
    }
}