【问题标题】:JSoup CSS / DOM questionsJSoup CSS / DOM 问题
【发布时间】:2016-11-30 18:38:14
【问题描述】:

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

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

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

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


2.

如何在 Jsoup 中的 CSS 中指定子级? 比如我右击图中蓝色标记线上方的span class字段,点击“复制选择器”:

#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

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


3.

在查找特定值/节点时,是否对如何查找以及如何找到正确的路径有很好的见解?

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

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

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

【问题讨论】:

  • 你好。请ask one question per post。此外,由于 jsoup 是 Java 库,因此使用 java 标签而不是 javascript 可能会得到更好的响应。
  • 您的第一个和第二个问题的答案可能在这里jsoup.org/cookbook/extracting-data/selector-syntax 和元素/元素文档中(如果您对单独处理文本节点感兴趣,也可以使用 Node)。
  • 那么我应该编辑问题并再创建 2 个线程吗?而且我已经看过它,但我仍然无法获得我需要的正确值:(。
  • 是的,尝试在帖子中一次只关注一件事。如果您对代码有特定问题,最好在帖子中包含您的代码尝试 (SSCCE / minimal reproducible example)。
  • 好吧,我想这次我要把它们放在一起,因为它们都与彼此和图片相关,我将编辑并添加代码来自的网站,以便人们能够查看它在图片旁边。下次我会这样做,非常感谢 Pshemo

标签: java css dom jsoup


【解决方案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) 有很多方法可以指定孩子。您可以使用 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 在 onLoad 发生了变化,那么你需要在解析之前渲染页面。以下是如何执行此操作的示例:https://stackoverflow.com/a/38572859/1176178

【讨论】:

  • 我仍然无法获得我在图片中指向的代码:(。是因为文本本身在跨度/元素之外吗?在谷歌开发工具中我能够去 MD5 孩子那里得到它,但在 JSoup 中我无法做到:(。
  • @ShlomiBazel 我编辑了我对问题 1 的回复。看起来您正在抓取的网站仅限于某些用户代理。我将它设置为 Mozilla 并且能够拉下 md5 哈希。
  • 谢谢老兄,不胜感激。
猜你喜欢
  • 2015-08-02
  • 2013-06-08
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多