我想从 Google keyword search 的结果页面中的表中解析一些数据( https://www.google.com/finance?q=apple&ei=GEiNV9CILMPksAHJmYXQDg )
搜索是:1 : https://www.google.com/finance?q=apple&ei=GEiNV9CILMPksAHJmYXQDg (关键字:苹果)。结果显示了苹果公司和同类公司的股价信息。我想解析包含股价的表格。
html结构是:
我的代码是:
public static void testGoogle() throws IOException {
Document doc = Jsoup.connect("https://www.google.com/finance?q=apple&ei=GEiNV9CILMPksAHJmYXQDg").userAgent("Mozzila").get();
Elements mainbody = doc.select("div.elastic>"
+ "div#app.g-section.g-tpl-left-11p4em>div#gf-viewc.g-unit>div.fjfe-content>div.g-wrap>"
+ "div.g-section.g-tpl-right-1.sfe-break-top-5>div.g-unit>div.g-c.sfe-break-right>"
+ "div#related > div.id-related-table.gf-table > table)");
(Also tried)
//+ "div#related > div.id-related-table.gf-table > table#cc-table.gf-table)");
System.out.println("Html " + mainbody);
}
我可以获取到 div#related 部分的信息,但之后的表格不显示。我尝试使用 Chrome css 选择器和 Xpath 选项来确保我获得正确的 css 路径。如果我缺少 css 路径或 jsoup 未从该表解析的任何其他原因,我将不胜感激。提前致谢!
最佳答案
您面临的问题是页面 DOM 在使用 JavaScript 加载到浏览器后发生了变化。 Jsoup 通过解析原始源代码来工作。它无法解析呈现的 DOM。为了解析该表,您需要使用类似 HTML Unit 的内容呈现页面。然后就可以使用Jsoup了。
// load page and capture DOM
WebClient webClient = new WebClient();
HtmlPage myPage = webClient.getPage("https://www.google.com/finance?q=apple");
// convert to jsoup document
Document doc = Jsoup.parse(myPage.asXml());
// clean up resources
webClient.close();
// select desired data
Elements rows = doc.select("table#cc-table > tbody > tr");
for (Element row : rows) {
String symbol = row.select("td.ctsymbol").text();
String name = row.select("td.ctname").text();
String price = row.select("td.rgt").first().text();
System.out.println(symbol + " " + name + " " + price);
}
输出
AAPL Apple Inc. 104.14
SNDK SanDisk Corporation 76.18
MSFT Microsoft Corpora... 56.53
SSNNF SAMSUNG ELECTRONI... 0.00000
VZ Verizon Communica... 55.09
HPQ HP Inc 14.15
IBM Intl. Business Ma... 161.72
HTCKF HTC CORPORATION S... 11.82
SNE Sony Corp (ADR) 30.59
GOOGL Alphabet Inc 762.63
WDC Western Digital Corp 53.97
关于java - Jsoup 嵌套表解析不适用于搜索页面结果表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38600434/