【问题标题】:Is there a way to parse an entire HTML tag in JSoup?有没有办法在 JSoup 中解析整个 HTML 标签?
【发布时间】:2020-11-01 09:45:54
【问题描述】:

您好,我想知道是否有一种方法可以使用 JSoup 解析整个 HTML 标记?在下面的示例图片中,五个元素(4 个图像和 1 个字符串)都在“li”容器内。但是,当您打开“li”标签时,会有多个嵌套容器。有没有办法解析它,以便我可以访问这个“li”标签中包含的所有 5 个元素?我正在考虑使用 getElementsMatchingOwnText("Collins") 但这似乎只会让我得到“span class="text text_14 mix-text_color7">Panorama”。任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: java jsoup html-parsing


    【解决方案1】:

    是的,您可以使用 jsoup 遍历 <li> 标记的子代。

    这是您屏幕截图中 HTML 的简化版本,显示了 5 个元素:

    <li>
        <span class="foo"><img src="bar" class="img"></span>
        <span class="bar">Collins</span>
        <i class="baz1"><img src="baz1" class="img"></i>
        <i class="baz2"><img src="baz2" class="img"></i>
        <i class="baz3"><img src="baz3" class="img"></i>
    </li>
    

    假设您在文档中选择了这个特定的&lt;li&gt; 标签,您可以使用以下方法:

    String html = "<li><span class=\"foo\"><img src=\"bar\" class=\"img\"></span><span class=\"bar\">Collins</span><i class=\"baz1\"><img src=\"baz1\" class=\"img\"></i><i class=\"baz2\"><img src=\"baz2\" class=\"img\"></i><i class=\"baz3\"><img src=\"baz3\" class=\"img\"></i></li>";
    
    Document document = Jsoup.parse(html);
    
    Element element = document.selectFirst("li");
    element.children().forEach(child -> {
        // do your processing here - this is just an example:
        if (child.hasText()) {
            System.out.println(child.text());
        } else {
            System.out.println(child.html());
        }
    });
    

    以上代码打印如下输出:

    <img src="bar" class="img">
    Collins
    <img src="baz1" class="img">
    <img src="baz2" class="img">
    <img src="baz3" class="img">
    

    更新

    如果起点是一个 URL,那么你需要从这个开始:

    Document document = Jsoup.connect("https://www...").get();
    

    接下来的练习是关于确定一种独特的方式来找到您的特定元素。因此,如果我们更新我之前的示例,假设您的网页是这样的:

    <html>
        <head>...</head>
        <body>
            <div>
                <ul class="vList_4">
     
                    <li>
                        <span class="foo"><img src="bar" class="img"></span>
                        <span class="bar">Collins</span>
                        <i class="baz1"><img src="baz1" class="img"></i>
                        <i class="baz2"><img src="baz2" class="img"></i>
                        <i class="baz3"><img src="baz3" class="img"></i>
                    </li>
                </ul>
            </div>
        </body
    </html>
    

    在这里,我们在 &lt;ul&gt; 标记中有一个名为 vList_4 的类。如果这是一个唯一的类名,我们可以使用它跳转到 HTML 页面的该部分(ID 比类名更好,因为它们保证是唯一的 - 但我在您的屏幕截图中没有看到任何 ID 名称)。

    现在,代替我之前的选择器:

    Element element = document.selectFirst("li");
    

    我们可以使用这个更具体的选择器:

    Element element = document.selectFirst("ul.vList_4 li");
    

    将打印与以前相同的结果。

    因此,您只需查看页面结构并弄清楚如何跳转到页面的相关部分。

    请参阅此处以了解 technical details 描述如何构建选择器。

    【讨论】:

    • 您好,非常感谢您的回复!我想知道是否有另一种方法来抓住
    • 标签而不用全部输入并将其存储到 html 字段中,因为数据可能会改变?
  • 如何获取该标签取决于 HTML 页面的更广泛的上下文。您需要在问题中显示页面的整体结构,以获得帮助。例如,它是页面中唯一的&lt;li&gt; 标签吗?它是否包含在另一个可以唯一标识或以其他方式选择的标签中?等等……
  • 当然,通常起点是 URL。不是一段文字。
  • 这个
  • 标签嵌套在另一个
  • 标签中哈哈,这让我很困惑,在较大的
  • 标签中还有
  • 标签。我在上面贴了一张它的照片(第三张照片)
  • 查看更新的答案 - 就是您查看页面结构,找到要提取的部分的路径。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签