使用Jsoup展平HTML文档

使用Jsoup展平HTML文档,html,dom,jsoup,shred,Html,Dom,Jsoup,Shred,HTML文档是分层的,可以使用解析将其解析为DOM树 有没有一种方法可以使用模式匹配来提取这些文档中的语义“节”,其中每个匹配表示“节”的开始和前一个节的结束,并且节可以无限地包含子节 这里的主要困难在于,属于“节”开头的HTML文本不一定是有效的HTML(例如,在节开头嵌套在其他标记中的情况下)。提取“部分”及其直接“子部分”(subsection)的所有HTML内容的遍历将是所需的输出 请注意,这个问题可以简化为提取两个HTML标记之间的内容(包含部分的开头和独占部分的开头),因为即使模式正

HTML
文档是分层的,可以使用解析将其解析为
DOM

有没有一种方法可以使用模式匹配来提取这些文档中的语义“节”,其中每个匹配表示“节”的开始和前一个节的结束,并且节可以无限地包含子节

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

请注意,这个问题可以简化为提取两个HTML标记之间的内容(包含部分的开头和独占部分的开头),因为即使模式正确匹配文档中的一些随机文本,也可以使用其周围的第一个HTML标记

在Jsoup中是否有这样做的方法,即给定两个节点来提取中间的HTML,而不管它们属于哪个层次(嵌套)级别?

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

这是原始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>

扁平化HTML文档
扁平化HTML文档
要求读取内存中的每个文档并提取其“部分”
按顺序,以树状方式跟踪子部分。 介绍 使用预定义的标记值展平HTML文档
标记节的开始,这也是上一节的结束。 方法论 这样做的最佳方式是什么

  • 递归 一种方法是递归。但是我们如何保持状态(部分限制)?
    • 第一种方法通过方法参数传递状态

    • 第二种方法通过方法返回值传递状态

    还有基于树的方法

  • 树遍历 另一种方法是树遍历。但是我们如何保持状态(部分限制)?
  • 深度优先搜索选项:前序、顺序、后序

  • 广度优先搜索仅限BFS
结论 使用预定义的标记展平(切碎)一个HTML文档
(例如,像h1这样的HTML头标签)是一个令人着迷的问题


我相信它在某种程度上可以通过css选择器来处理,比如:

:has(:is(h1,h2,h3,h4,h5) ~ p)
这将返回包含标题和同级段落的元素的平面列表

如果你想在你的应用模型中保持一个层次结构布局,你必须递归地迭代上面的结果,并对每个结果执行相同的选择器(以获得它们的内部部分)。或者简单地遍历树,查看什么是什么的父对象

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