使用HtmlUnit获取Facebook页面帖子的XPath

时间:2014-01-26 03:13:41

标签: javascript ajax facebook selenium-webdriver htmlunit

我想使用HtmlUnit获取facebook帖子的xpath。您可以参考这两个问题,以获得有关我想要做的更多想法:

  1. Supernatural behaviour with a facebook page
  2. HtmlUnit commenting out lines of facebook page
  3. 为了模拟我所做的事,你可以按照q-1。 HTML代码(Facebook页面)的pastebin链接是http://pastebin.com/MfXsYSJQ

    或者只是你可以去https://www.facebook.com/bhramakarserver。 我只想获得包含帖子的文本的跨度xpath:“嗨!这是本页的第一篇文章。” 我试过的是:

        public class ForStackOverflow {
            public static void main(String[] args) throws IOException {
                WebClient client=new WebClient(BrowserVersion.FIREFOX_17);
                client.getOptions().setJavaScriptEnabled(true);
                client.getOptions().setRedirectEnabled(true);
                client.getOptions().setThrowExceptionOnScriptError(true);
                client.getOptions().setCssEnabled(true);
                client.getOptions().setUseInsecureSSL(true);
                client.getOptions().setThrowExceptionOnFailingStatusCode(false);
                client.setAjaxController(new NicelyResynchronizingAjaxController());
    
                HtmlPage page1=client.getPage("https://www.facebook.com/bhramakarserver");
                System.out.println(page1.asXml());
                //getting the xpath of span of class="userContent"
                HtmlInput input=(HtmlInput)page1.getByXPath("/html/body//input[@type='submit']").get(0);
                System.out.println(input.asXml());
    //This line gives error as the xpath evaluates to null
                HtmlSpan span=(HtmlSpan)page1.getByXPath("/html/body//span[@class='userContent']").get(0);
            }
        }
    

    看来问题是page1有静态html。在这里,span元素:

    <span data-ft="&#123;&quot;tn&quot;:&quot;K&quot;&#125;" class="userContent">Hi! this is the  first post of this page.</span>
    

    是动态生成的。因此它在第1页的html中显示为注释。但是通过inspect元素进行检查时,它看起来正常。因此它动态地取消注释。在加载了所有动态内容后,我无法让page1的html处于状态,这样我就可以正确地获取xpath了吗?可以使用硒网络驱动程序吗?

1 个答案:

答案 0 :(得分:1)

鉴于这些信息,假设某些AJAX调用未被触发或您没有正确等待AJAX​​执行似乎是公平的。我没有使用AJAX控制器获得最佳结果。可悲的是,循环通常是最好的方法。

我在这个问题中解释了如何做到这一点:Get the changed HTML content after it's updated by Javascript? (htmlunit)

如果这不起作用,那么可能你会得到一个JavaScript异常。在其他问题中,我已经为这种情况写了一些可能的解决方法:How to overcome an HTMLUnit ScriptException?

如果这些都不起作用......那么我建议使用其他东西而不是HTMLUnit。任何真正的浏览器驱动器都可以解决问题或者使用其他替代方案,例如PhantomJS或ZombieJS。