页面上的一个块由javascript填充内容,在用jsoup加载页面之后,没有任何信息。有没有一种方法可以在解析页面时也获得javascript生成的内容 Jsoup
?
无法在此处粘贴页面代码,因为它太长:http://pastebin.com/qw4rfqgw
以下是我需要的内容: <div id='tags_list'></div>
我需要用java来获取这些信息。最好使用jsoup。元素在javascript的帮助下是字段:
<div id="tags_list">
<a href="/tagsc0t20099.html" style="font-size:14;">разведчик</a>
<a href="/tagsc0t1879.html" style="font-size:14;">Sr</a>
<a href="/tagsc0t3140.html" style="font-size:14;">стратегический</a>
</div>
java代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class Test
{
public static void main( String[] args )
{
try
{
Document Doc = Jsoup.connect( "http://www.bestreferat.ru/referat-32558.html" ).get();
Elements Tags = Doc.select( "#tags_list a" );
for ( Element Tag : Tags )
{
System.out.println( Tag.text() );
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
9条答案
按热度按时间7lrncoxx1#
尝试:
rqqzpn5f2#
在指定用户代理之后,我的问题就解决了。
https://github.com/jhy/jsoup/issues/287#issuecomment-12769155
knpiaxh13#
我知道有一种方法!也许这更像是一种“变通方法”,而不是一种“方法。。。下面的代码检查元属性“刷新”和javascript重定向。。。如果其中任何一个存在
RedirectedUrl
变量已设置。所以你知道你的目标。。。然后您可以检索目标页并继续。。。eaf3rand4#
用com.codeborne.phantomjsdriver在我的例子中解决了注意:这是groovy代码。
pom.xml文件
幻影.groovy
classinproject.groovy类
yruzcnhs5#
可以通过组合
JSoup
在我的示例中,我使用了另一个框架来解释网页HtmlUnit
.mo49yndu6#
在用jsoup解析页面时,有没有一种方法可以同时获得javascript生成的内容?
我想不,如果不用java构建一个完整的javascript解释器,这将是多么困难。
bweufnob7#
你需要了解发生了什么:
当你从一个网站上查询一个页面时,不管是使用jsoup还是浏览器,返回给你的都是一些html。jsoup能够解析它。
然而,大多数网站在该html中包含javascript,或者从该html链接,这将用内容填充页面。您的浏览器能够执行javascript,从而填充页面。jsoup不是。
理解这一点的方法如下:解析html代码很容易。执行javascript代码并更新相应的html代码要复杂得多,这是浏览器的工作。
以下是解决此类问题的一些方法:
如果您可以找到javascript代码正在进行的ajax调用,即加载内容,那么您可以将这些调用的url与jsoup一起使用。为此,请使用浏览器中的开发人员工具。但这并不能保证有效:
这可能是因为url是动态的,并且取决于当时页面上的内容
如果内容不是公开的,那么cookies就会被涉及,仅仅查询资源url是不够的
在这些情况下,您需要“模拟”浏览器的工作。幸运的是,这样的工具是存在的。我认识并推荐的是幻影。它与javascript一起工作,您需要通过启动一个新进程从java启动它。如果您想坚持使用java,本文将列出一些java替代方案。
qpgpyjmq8#
jsoup是一个html解析器,而不是某种嵌入式浏览器引擎。这意味着它完全不知道在初始页面加载之后javascript添加到dom的任何内容。
要访问这种类型的内容,您需要一个嵌入式浏览器组件,关于这种组件有很多讨论,例如有没有一种方法可以将浏览器嵌入java?
6ioyuze29#
在javascript脚本加载完成后,您可以使用jsoup和htmlunit的组合来获取页面内容。
pom.xml文件
文件中的简单示例https://riptutorial.com/jsoup/example/16274/parsing-javascript-generated-page-with-jsoup-and-htmunit
一个复杂的例子:加载login,获取session和csrf,然后发布并等待主页完成加载(15秒)