【问题标题】:How to get start- and endpositions of HTML tags in Java?如何在 Java 中获取 HTML 标记的开始和结束位置?
【发布时间】:2016-05-15 18:29:31
【问题描述】:

在我的 Java 应用程序中,我需要分析 HTML。到目前为止,我使用 JSoup 并且效果很好。但现在,我需要从 HTML 字符串中获取已清理的文本,此外,还需要获取已删除标签的位置。例如,如果我有

Some HTML <b id="boldtext">text</b>

需要的输出是

Some HTML text

还有信息,从位置 10 到 14 有一个 b-tag(我需要标签的位置,就好像那里没有标签一样)并且标签的 id 为“boldtext”。

(我希望我能说清楚我需要什么,我不太擅长解释 - 它类似于 this 问题,除了我还需要找到的标签的属性并且它是 Java,而不是 Python)

我想用 JSoup 来做这件事,但没有找到方法(如果有,请告诉我!)。实现我自己的算法也效果不佳,难以理解并导致许多错误。那么,获取所需信息的好方法是什么?有没有办法使用 JSoup 做到这一点?我需要一个不同的图书馆吗?任何帮助表示赞赏!

**编辑:**我将尝试更清楚地说明我需要什么。在上面的示例中,我需要 HTML-clean 文本以及剩余文本的哪一部分是粗体的信息。我需要开始和结束位置,但是HTML标签后来被删除了,所以在搜索正确的位置时不能计算它们。

完美的输出将是一个对象列表,每个对象都包含有关一个标签的信息(我所说的标签是指属于一起的开始和结束标签):标签类型(例如“b”、“quote”等。 )、标签内容(不含 HTML)、属性以及标签的开始和结束位置。同样,当我从标签中删除标签时,位置需要保持有效!清除标签后,应用程序仍然需要知道“文本”是粗体,而不是在删除标签之前,结束标签的开头是 31,因为在删除标签时,正确的结束位置移动了 17 个字符向左。

【问题讨论】:

    标签: java html string jsoup


    【解决方案1】:

    您可以使用正则表达式来查找所有 HTML 标记并将其替换为空字符串。正则表达式匹配器也可以返回匹配组的索引。

    import java.util.regex.Matcher;
    

    导入 java.util.regex.Pattern;

    /** * */

    /** * @作者用户 * */ 公共类 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 "";
        }
    

    【讨论】:

    • 如果找不到更好的解决方案,我想我会使用此解决方案,但它并非万无一失。如果我得到这个:'HTML text 和另一个 HTML text' 它将无法正常工作
    • 在这种情况下,您可以使用标签在 DOM 中的位置来确定正确的开始和结束位置。
    【解决方案2】:

    如果您将 HTML 之前和之后作为字符串,那么您可以使用 Apache Diff Builder 来获取您需要的信息。

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2021-02-05
      • 1970-01-01
      相关资源
      最近更新 更多