使用 Jsoup 扁平化 HTML 文档

如何解决使用 Jsoup 扁平化 HTML 文档

HTML 文档是分层的,可以使用 Jsoup 解析为 DOM 树。

有没有办法在这些文档中提取语义“部分”,使用模式匹配,其中每个匹配表示“部分”的开始和前一个“部分”的结束,并且部分可以有子部分,无限期?

这里的主要困难是属于“节”开头的 HTML 文本不一定是有效的 HTML(例如,在节开头嵌套在其他标签内的情况下)。提取“部分”及其直接“子部分”(子部分)的所有 HTML 内容的遍历将是所需的输出

请注意,问题可以简化为提取两个 HTML 标记间的内容(节的开始,包括和 ned 节的开始,独占),因为即使模式正确匹配了一些随机文本文档,可以使用它的第一个环绕 HTML 标签

Is there any way of doing this in Jsoup,i.e. given 2 Nodes to extract the HTML in between,irrespective of the hierarchical (nesting) level they belong to?

以下示例使用标签匹配来描述语义“部分”,为简单起见仅限于 HTML 标头(例如 <h1>)。 “部分”的层次结构是:

{Flattening HTML Documents [
    {Introduction},{Methodology [
      {Recursion [
        {First Approach},{Second Approach}]
      },{Tree Traversal [
       {Depth-First Search},{Breadth-First Search}]
      }
    },{Conclusion}
}

这是原始 HTML。

<html>
  <head><title>Flattening HTML Documents</title></head>
  <body>
<h1>Flattening HTML Documents</h1>
    The requirement is to read each document in memory and extract its "sections",<br/>
    in sequential order,keeping track of subsections,in a tree-like manner.
    <div>
      <h2>Introduction</h2>
      Flattening HTML documents using <em><u>predefined</u> tag</em> values<br/>
      to mark the start of a section,which is also the end of the prevIoUs section.
    </div>
    <div>
      <h2>Methodology</h2>
      <p>What would be the optimal way of doing this?</p>
      <ul>
        <li>
          <h3>Recursion</h3>
          One method is <strong>recursion</strong>. But how do we keep state (section limits)?
          <ul>
            <li><h4>First Approach</h4><p>Pass state via method arguments</p></li>
            <li><h4>Second Apporach</h4><p>Pass state via method return values</p></li>
          </ul>
          <p>There are also <strong>tree-based</strong> methods.</p>
        </li>
        <li>
          <h3>Tree traversal</h3>
          Another method is <strong>tree traversal</strong>. But how do we keep state (section limits)?
          <ol>
            <li><h4>Depth-First Search</h4><p>Options: <b>preorder</b>,<b>inorder</b>,<b>postorder</b></p></li>
            <li><h4>Breadth-First Search</h4><p>Just <b>BFS</b>.</li>
          </ol>
        </li>
      </ul>
    </div>
    <div>
      <h2>Conclusion</h2>
      <p>Flattening (shredding) an <strong>HTML</strong> document using predefined tags<br/>
      (e.g.,HTML header tags like &lt;h1&gt;) is a fascinating problem.</p>
    </div>  
  </body>
</html>

解决方法

我相信它可以在某种程度上由 css 选择器来处理,就像这样:

:has(:is(h1,h2,h3,h4,h5) ~ p)

这将返回一个包含标题和同级段落的元素的平面列表。

如果您想在应用程序模型中保持分层布局,则必须递归迭代上述结果并针对每个结果执行相同的选择器(以获取它们的内部部分)。或者简单地向上遍历树以查看什么是什么的父级。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?