【问题标题】:HtmlUnit and Fragment IdentitiesHtmlUnit 和片段标识
【发布时间】:2011-01-03 20:43:41
【问题描述】:

我目前想知道如何处理片段身份,我想从中获取信息的链接包含片段身份。似乎 HtmlUnit 正在丢弃我的 url 的“#/db4mj”,因此加载了原始 url。

有人知道处理片段身份的方法吗? (如果需要,我可以发布示例代码以进一步解释)

编辑

由于我没有获得很多视图(也没有答案),我将添加一个赏金。抱歉只有50个,但我一开始只有79个

编辑

这里是一个请求的示例代码。

我们的网址是:http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0

因此,如果您查看链接中的内容,您会看到多个包含 URL 的画笔。所以我的脚本抓取了 URL:http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4

如您所见,有片段标识符 #/dbwam4 现在我尝试抓取此页面上的内容,但 HtmlUnit 仍然认为它在原始 URL 上。

这是我脚本中的示例代码,它在片段标识符 URL 上失败,但原始 URL 没有问题。

client = new WebClient(BrowserVersion.FIREFOX_3)
client.javaScriptEnabled = false

page = client.getPage(url)       //url with fragment identifier

//this is on the url with the fragment identifier only, not the original url
img = page.getByXPath("*[@id="gmi-ResViewSizer_img"]")

我希望能够从带有片段标识符的 URL 中获取某些信息,但我无法访问它。

【问题讨论】:

  • 示例代码将非常有帮助,并且可以解释您期望它做什么。我快速浏览了 HtmlUnit 代码,WebRequest 似乎支持片段标识符。
  • 为您添加了更多解释和示例代码。我之前与一位成员进行了部分讨论,但没有得出结论。如果上面讨论得不够好,也许是在:stackoverflow.com/questions/4320179/…

标签: url identity htmlunit fragment


【解决方案1】:

好消息坏消息

首先,好消息是 HtmlUnit 似乎工作得很好。

如果您在关闭 JavaScript 的浏览器中访问the page with the fragment identier URL(可能使用Firefox's QuickJava plugin),您将看不到您想要的“单刷视图”。

因此,为了获取此页面,您需要使用 WebClient 并将 setJavaScriptEnabled 设置为 true。

现在是坏消息:

我一直无法在打开 JavaScript 的情况下使用 HtmlUnit 获取“单刷视图”页面(我不知道为什么)。虽然,我已经能够获得完整的页面。

真正的问题是返回的 HTML 的状态非常糟糕,以至于无法解析它(我尝试了TagSoupjsoupJaxen 等)。因此,我怀疑尝试使用 XPath 解析页面可能对您不起作用。

因此,我认为您需要使用正则表达式(这远非理想),甚至使用 String.indexOf("gmi-ResViewSizer_img") 的一些变体。

我希望这会有所帮助。

编辑

我设法得到了一些偶尔有效的东西。恐怕我还没有转换到 Groovy,所以它将是普通的旧 Java。

我没有查看 HtmlUnit 的源代码,但运行保存过程中的某些东西似乎有助于解析工作?如果没有保存,我似乎会得到 NullPointerExceptions。

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.WebResponse;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.util.FalsifyingWebConnection;
import java.io.File;
import java.io.IOException;

public class TestProblem {

    public static void main(String[] args) throws IOException {
        WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6);
        client.setJavaScriptEnabled(true);
        client.setCssEnabled(false);
        String url = "http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4";
        client.setThrowExceptionOnScriptError(false);
        client.setThrowExceptionOnFailingStatusCode(false);
        client.setWebConnection(new FalsifyingWebConnection(client) {

            @Override
            public WebResponse getResponse(final WebRequest request) throws IOException {
                if ("www.google-analytics.com".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                if ("d.unanimis.co.uk".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                if ("edge.quantserve.com".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                if ("b.scorecardresearch.com".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                //
                if (request.getUrl().toString().startsWith("http://st.deviantart.net/css/v6core_jc.js")) {
                    WebResponse wr = super.getResponse(request);
                    return createWebResponse(request, wr.getContentAsString(), "application/javascript");
                }
                if (request.getUrl().toString().startsWith("http://st.deviantart.net/css/v6loggedin_jc.js")) {
                    WebResponse wr = super.getResponse(request);
                    return createWebResponse(request, wr.getContentAsString(), "application/javascript");
                }
                return super.getResponse(request);
            }
        });

        HtmlPage page = client.getPage(url);       //url with fragment identifier



        File saveFile = new File("saved.html");
        if(saveFile.exists()){
            saveFile.delete();
            saveFile = new File("saved.html");
        }
        page.save(saveFile);


        HtmlElement img = page.getElementById("gmi-ResViewSizer_img");
        System.out.println(img.toString());

    }
}

【讨论】:

  • 但是正则表达式呢?恐怖!
  • 感谢您检查它马克。我将把这个问题留到明天,以防其他人对此有任何想法。看看你付出的努力;我认为你是对的。当你看的时候,你能在“单刷视图”页面上找到任何其他信息吗? (标题、下载链接等) 我将启用 javascript 并四处看看。 (每当我启用它时,它都会使我的窗口变得臃肿且难以阅读)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多