【问题标题】:Extract text between two <hr> tags in CSS-less HTML在无 CSS 的 HTML 中提取两个 <hr> 标签之间的文本
【发布时间】:2011-11-09 13:02:24
【问题描述】:

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

唯一能始终如一地标识该文本段(并且保证保持这种状态)的是 HTML 总是看起来像这样(在更大的 HTML 正文中):

<hr>
2%%17
<hr>

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

如果该文本位于封闭且唯一标识&lt;span&gt;&lt;div&gt; 中,则使用Jsoup 提取它没有问题。问题是情况并非如此,我现在能想到的唯一方法(这 一点也不 优雅)是通过一个处理 raw HTML正则表达式。

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

建议?

【问题讨论】:

  • 你试过调试jsoup元素看看有没有元素吗?
  • @ariel 是的,元素在那里,但它们不是“封闭元素”,所以我不能真正使用element.text() 来获得令人垂涎的[number]%%[number] . :)
  • @ariel 问题是[number]%%[number] 不是 元素。所以,就目前而言,我的解决方法是采用body.html() 并将其传递给识别上述模式的正则表达式。但我愿意接受更优雅的解决方案。
  • 所以该元素不存在。它不被解析为元素,它只在主体上
  • 这种模式在 HTML 中是否出现多次?还是只有一次?

标签: java html-parsing jsoup


【解决方案1】:

这个怎么样?

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.
    }
}

【讨论】:

  • 这个解决方案中肯定有更多的 jsoup,但由于无论如何它都必须求助于正则表达式,现在的问题是通过正则表达式传递 body.HTML() 是否会更快。
  • 您正在寻找文本节点内的模式。 Jsoup 不能为您做很多事情,因为它不是正则表达式匹配器。
  • 当然。但我现在很好奇循环遍历 hrs 是否比顶级正则表达式更快。
  • 类似 (
    )\s*(\d+)%%(\d+)\s*(
    )
  • 如果要匹配的字符串尽可能小,Regex 至少会更快。通过它传递整个文档,而不是只传递您确定它可以包含您正在寻找的数据的最小可能的sn-ps会更昂贵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2018-03-16
  • 2015-08-11
  • 1970-01-01
相关资源
最近更新 更多