2016-07-26 49 views
1

JSoup CSS/DOM问题

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

我想在图片中的文字,在谷歌开发者工具我会做到这一点(我基本上去到另一个childnode跨度的找到MD5在DevTools但在Jsoup似乎不同,并且仅返回“MD5”文本)

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

我不能开始使用JSoup d它管理OM /选择。 (如果有可能给这两个例子)


2.

如何在Jsoup在CSS中指定一个孩子? 例如,我右键单击上方的蓝色跨度类字段标在图片线,并单击“复制选择”:

#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],同时查看属性并查看我需要的正确属性,但我知道这不是我猜测的正确方法?

+2

你好。请[每个帖子询问一个问题](http://meta.stackexchange.com/questions/222735/can-i-ask-only-one-question-per-post)。另外,因为jsoup是Java库,所以您可能会使用'java'标记而不是'javascript'获得更好的响应。 – Pshemo

+0

此外,您的第一个和第二个问题的答案可能是https://jsoup.org/cookbook/extracting-data/selector-syntax和Element/Elements文档(如果您有兴趣单独处理文本节点,也可以使用Node) 。 – Pshemo

+0

所以我应该编辑问题并制作2个线程? 我已经看过它,但我仍然没有设法得到我需要的正确值:(。 –

回答

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

+0

我仍然无法获得我在图片中指出的代码:(。 是因为,文本本身在span /元素之外吗? 在google开发工具中,我可以去MD5小孩并得到它,但是在JSoup I不能马nage做到这一点:(。 –

+0

@ShlomiBazel我编辑了我对问题1的回复。它看起来像你正在抓取的网站仅限于某些用户代理。我将它设置为Mozilla并能够下拉md5散列。 –

+0

谢谢老兄,非常感谢。 –