java - JSoup CSS/DOM 问题

标签 java css dom jsoup

1. (来自:https://www.virustotal.com/en/file/7b6b268cbca9d421aabba5f08533d3dcaba50e0f7887b07ef2bd66bf218b35ff/analysis/)

我想获取图片中的文本,在 Google 开发人员工具中我会这样做(我基本上进入跨度的另一个子节点以在 DevTools 中找到 md5 但在 Jsoup 中它似乎不同并且只返回“md5”文本)

document.getElementById("additional-info-content").childNodes[1].children[1].childNodes[1].innerHTML

我无法使用 JSoup dom/selector 获取它。 (如果可以给出这两个例子的话)


2.

我如何在 Jsoup 的 CSS 中指定一个 child ? 比如我右击图中蓝色标线上方的span class字段,点击“Copy Selector”:

#file-details > div:nth-child(2) > div:nth-child(1) > span

它给我文件详细信息作为第一个 div,甚至认为它不是文档中唯一的文件详细信息,但是好吧,假设它应该是这样的(?):

#additional-info-content > div:file-details > div:nth-child(2) > div:nth-child(1) > span

我如何设法将它翻译成与 child 一起工作的 JSoup CSS 脚本? (如果可能的话,还有 DOM 示例)


3.

在寻找特定值/节点时,是否有很好的洞察力,如何寻找以及如何找到正确的路径?

我现在所做的基本上是打开 Developer Tools,然后单击一个唯一的 div 类名,然后在 DevTools 中的属性窗口中检查子节点,并继续挖掘子节点,直到找到正确的路径。 ..(就像我在第一个问题中复制的一样)

有没有更好的方法来看待这个问题?

我的意思是,使用 DevTools 控制台非常简单,只需编写 .children[1].childnodes[3].children[1] 查看属性并看到我需要的正确属性,但我知道这不是我猜的正确方式?

最佳答案

1)

    // connect to url and retrieve source code as document
    Document doc = Jsoup
            .connect(url)
            .userAgent("Mozilla/5.0")
            .referrer("http://www.google.com")
            .get();

    String md5= doc

            // use CSS selector to grab only enums which contain md5
            .select("div#file-details.extra-info > div.enum-container > div.enum:contains(md5)")

            // use the first element in the result set
            .first()

            // use only its text node and ignore the text node of the span
            .ownText();

2) 有很多方法可以指定 child 。您可以使用 CSS 选择器或一些 jsoup 便捷方法。

如果我想从以下 html 中提取文本 foo:

<html>
 <body>
  <div> 
   <span><b>foo</b></span> 
   <span><b>bar</b></span>
  </div>
 </body>
</html>

每一个都会产生相同的结果:

    doc.select("div > span > b").last().ownText();

    doc.select("div > span > b").get(1).ownText();

    doc.select("div > span:last-child > b").text();

    doc.select("div > span:last-child").text();

    doc.select("div > span").last().text();

    doc.select("div > span").get(1).text();

    doc.select("div > span:last-child > b").first().ownText();

    doc.select("span > b").last().text();

决定采用哪种方式实际上取决于您正在解析的文档的 HTML 结构。参见 CSS Selectors更多示例。


3) 检查源代码,而不是浏览器中呈现的代码。 Jsoup 不调用 JavaScript。如果你的页面的 DOM 在加载时发生了变化,那么你需要在解析之前渲染页面。以下是如何执行此操作的示例:https://stackoverflow.com/a/38572859/1176178

关于java - JSoup CSS/DOM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601311/

相关文章:

java - 使用新的 RestTemplate 与restTemplateBuilder 创建 RestTemplate

java - Java非阻塞socket的flush操作

html - block Bootstrap 作为平板电脑大小

html - Unblur 模糊背景 div 中的内容

javascript - 如何打开/关闭? (JavaScript)

java - Java 中的 System.out.write() - 不打印整数值的最低有效位

html - 为什么高度没有 : 100% work to expand divs to the screen height?

javascript - 如何知道何时将元素添加到 Angular 2 上的 DOM?

javascript - 在不删除关联事件的情况下从节点中删除元素?

Java平台独立加密