通过Jsoup获取innerHTML

时间:2014-02-22 15:05:32

标签: html web-scraping jsoup

我试图从这个网站抓取数据:http://www.bundesliga.de/de/liga/tabelle/

在源代码中我可以看到表格,但没有内容,只有:

<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
....

使用firebug(Firefox中的F12)我也不会看到任何内容,但我可以选择表格,然后通过firebug选项复制innerHTML。在那种情况下,我得到了关于团队的所有信息,但我不知道如何获得Jsoup中的内容表。

2 个答案:

答案 0 :(得分:6)

  

要获取属性的值,请使用Node.attr(String key)方法       对于元素(及其组合子元素)上的文本,请使用Element.text()       对于HTML,请根据需要使用Element.html()或Node.outerHtml()       例如:

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();

String text = doc.body().text(); // "An example link"
String linkHref = link.attr("href"); // "http://example.com/"
String linkText = link.text(); // "example""

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"

参考: http://jsoup.org/cookbook/extracting-data/attributes-text-html

答案 1 :(得分:2)

该表不是直接在服务器上呈现,而是由页面的客户端JavaScript构建,并使用通过AJAX到达客户端的数据构建。所以你应该用天真的Jsoup方法得到什么。

我看到两种可能的解决方案:

  1. 您可以分析网络流量并识别网站正在进行的ajax调用。然后,您尝试重建格式并触发与JavaScript相同的请求。然后你可以重建表格。
  2. 您不使用Jsoup而是使用真正的浏览器,它会加载页面并运行JavaScript,包括所有AJAX调用。您可以使用Selenium webdriver。有一个名为phantomjs的无头浏览器,其占用空间相对较小,可以与selenium webdriver结合使用。
  3. 两种选择都有其优势:

    1. 这需要更多时间,因为您需要了解网络流量非常好。奖励将是一个非常快速和内存效率高的刮刀。
    2. 硒的编程非常简单,实现目标不会有任何困难。您不需要了解要抓取的站点的内部工作方式。但是,价格是您项目的进一步依赖。内存消耗很高。另一个过程运行。刮痧会很慢。
    3. 也许你在足球桌上找到了另一个持有你想要的信息的来源?这可能是最简单的。例如http://www.fussballdaten.de/bundesliga/