2016-07-26 57 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

謝謝老兄,非常感謝。 –