java - 使用 JSoup 解析 HTML 列表以创建树结构

标签 java html jsoup

我有 HTML 列表,其结构与我需要使用 JSoup 解析的完全相同(我的语言是 Java)。这是一个例子:

<div class="ulist">
  <ul>
    <li><p>Healthy Food</p></li>
    <div class="ulist">
      <ul>
        <li><p>Vegetables</p></li>
        <div class="ulist">
          <ul>
            <li> <p>Carrots</p> </li>
            <li> <p>Lettuce</p> </li>
            <li> <p>Cucumbers</p> </li>
          </ul>
        </div> </li>
        <li> <p>Fruits</p>
          <div class="ulist">
            <ul>
              <li> <p>Apples</p> </li>
              <li> <p>Bananas</p> </li>
              <li> <p>Canned Fruits</p></li>
              <div class="ulist">
                <ul>
                  <li> <p>Peaches</p> </li>
                  <li> <p>Pears</p> </li>
                </ul>
              </div>
            </ul>
          </div>
        </li>
      </ul>
    </div>
  </ul>
</div>

由于该数据基本上只是一个树数据结构,因此我希望能够解析它并从数据创建一个树。我在使用 JSoup 执行此操作时遇到困难,因为看起来您无法真正按预期遍历 DOM。

例如,代码如下:

Elements elList = doc.select("ul");
for (Element el: elList){
  Elements subList = el.select("ul");
  for (Element subEl : subList){
    //do whatever you need to do
  }
}

产生以下结果,看起来它不是“行走”或“遍历”下来,而是不断从文档中选择相同的内容:

enter image description here

什么代码可以遍历这个列表并将其放入树结构中?

最佳答案

在 JSoup 中,select()getElementByTag() 都会返回当前元素作为结果的一部分(如果它与标记匹配)。

因此,当您执行 doc.select("ul") 并对结果执行 select() 时,您将得到相同的结果,正如您已经注意到的那样。

正确执行此操作的关键是获取第一个元素,然后搜索其子元素。

大致如下:

public static Node processTree( Element elem ) {

     Node result;

     Elements elList = elem.getElementsByTag("ul");

     if ( elList == null || elList.size() == 0 ) {
         return null;
     };

     result = new Node();
     Element current = elList.first();
     elList = current.children();

     // Process LI elements and add them as content to the
     // result Node
     ...

     // Now go down the tree

     if ( elList != null && elList.size() != 0 ) {

        for ( Element el : elList ) {
            Node elTree = processTree( el );
            if ( elTree != null ) {
                result.addChild( elTree );
            }
        }
     }

     return result;
}

(当然,这只是一个草图。Node 将是您的树结构节点。这样做的目的是向您展示必须遍历子级。如果您愿意,您可以在同一循环中处理 li 元素)

关于java - 使用 JSoup 解析 HTML 列表以创建树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28052895/

相关文章:

jquery - Jsoup 类似于 C++/C 的解析器?

java - Android复选框在一个 Activity 中选中,然后按钮出现在另一个 Activity 中

java - 如何防止 "Firestore, Provided document path must not be null"错误?

java - 在 MatLab 中插入 Java 代码

Java:如何只处理 SIGTERM?

php - 如何使用 bootstrap 3 在 PHP 中构建混合列表单?

html - <html> 标签的 'lang' 属性是做什么用的?

javascript - 无法动态地将 div 内容复制到 dojo contentpane 中

android - SSL 握手异常 : Connection closed by peer

java - 将相对路径转换为绝对路径在 JSoup 中不起作用