2016-05-09 60 views
1

我可能会用错误的术语来说这个,所以如果我错了,请纠正。javascript执行后从DOM获取html

这是我想要做的:我试图抓取一个网站的评论部分,但评论是在页面完全加载后通过ajax调用加载的。当我尝试通过以下网址从网站上刮取HTML时:

res, err:= http.Get(url) 
if err != nil { 
    // handle error 
} 
defer res.Body.Close() 

但是它显然在ajax调用之前获取了html。如何在ajax调用后获取html?

这完全是我的头顶,但我需要基本上在这个代码中创建一个js渲染器?我的猜测是JS需要以某种方式执行。任何关于如何去做这件事的建议/图书馆/例子?我宁愿这样做,但它可以用任何语言写实。

+5

这是永远不会工作。我不会深究它,但Go http客户端不是浏览器。当页面加载到浏览器中时,浏览器解析脚本并执行它们,这在这里不会发生。如果你想刮一个页面,最好使用Selinium之类的东西,这个东西是用于网络用户界面自动化的。另一种选择是一个名为phantomjs的工具,它的功能相同,但在这种情况下,脚本不会执行。最重要的是,你需要使用JavaScript。您需要挂钩页面加载并在完成后运行callbakc。 – evanmcdonnal

+0

废弃注释部分,直接调用ajax网址加载评论,然后您将收到评论。 你有一个网站的例子来看看? – OscarRyz

回答

0

如果您拥有该网站或者可以轻松确定(或生成)加载注释的调用的URI,则自己完成相同的AJAX调用可能会更容易,而不必担心DOM解析或任意JS执行。

在这一点上,Go实际上是一种很好的语言,因为它的JSON和XML标准库非常适合解编这类数据。

2

你可以使用像http://phantomjs.org/这样的无头浏览器来获取页面,在其上执行所有的javascript并且删除评论。 这个例子可以帮助:https://github.com/ariya/phantomjs/blob/master/examples/phantomwebintro.js

但是phantomjs是单独的二进制应用程序,也许安装它可能不是那么平凡。

此外,您可以使用Firebug研究该页面,查看正在发送的请求以获取评论,并在进行中模拟此调用。

也许通过这样的

$.get("/ajax/comments", function(data) { 
    $(".comments").html(data); 
}); 

JavaScript代码的页面加载意见,以便您可以获取并使用去

1

最近解析/ajax/comments页面我有同样的问题和GoQuery帮助了很多 我试着第一个网站来自网络,JS事件加载了评论,并给你写了一小段代码。你可以试试看看。

doc,_ := goquery.NewDocument("http://www.ihg.com/holidayinn/hotels/us/en/san-francisco/sfocc/hoteldetail/hotel-reviews?scmisc=hotel_details_reviews_link_bottom") 
html_contents,_ := doc.Html() 
fmt.Println(html_contents) 

这将最初显示页面主要内容下的所有评论,这些评论是由JS事件加载的。

祝你好运!