使用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 <h1>) 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)