2011-01-03 2 views
4

В настоящее время я задаюсь вопросом, как обращаться с идентификаторами фрагментов, ссылкой, которую я хочу получить от информации, содержит идентификатор фрагмента. Кажется, что HtmlUnit отбрасывает «#/db4mj» моего url и, следовательно, загружает исходный url.HtmlUnit и Fragment Identities

Кто-нибудь знает, как обращаться с идентификаторами фрагментов? (Я могу разместить пример код для дальнейшего объяснения в случае необходимости)

EDIT

Поскольку я не получаю много точек зрения (и нет ответов), я собираюсь добавить щедроты. К сожалению, это только 50, но у меня было только 79, чтобы начать с

EDIT

Ниже приведен пример кода, как просили.

Наш URL будет: 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 с идентификатором фрагмента, но не могу получить доступ к этому вообще.

+1

Пример кода будет очень полезен и объяснит, что вы ожидаете от этого. Я быстро просмотрел код HtmlUnit, и WebRequest, похоже, поддерживает идентификаторы фрагментов. –

+1

Добавил еще несколько объяснений и пример кода для вас. Я частично обсуждал это с членом ранее, но не пришел к выводу. Если выше не обсуждается достаточно хорошо, возможно, он находится по адресу: http://stackoverflow.com/questions/4320179/htmlunit-getbyxpath-returns-null – StartingGroovy

ответ

1

хорошие новости и плохие новости.

Прежде всего, хорошая новость заключается в том, что HtmlUnit работает нормально.

Если вы посещаете the page with the fragment identier URL в браузере с выключенным JavaScript (возможно, с помощью Firefox's QuickJava plugin), вы не увидите изображения «одной кисти», которые вы хотите.

Для того, чтобы приобрести эту страницу, вам нужно использовать WebClient с setJavaScriptEnabled, установленным в true.

А теперь плохие новости:

Я не всегда был в состоянии приобрести «одного вида кисти» страницу с помощью HtmlUnit с JavaScript включен (я не знаю почему). Хотя, я смог получить полную страницу по случаю.

Настоящая проблема заключается в том, что состояние возвращаемого HTML настолько плохо, что не поддавалось попыткам его разобрать (я пробовал TagSoup, jsoup, Jaxen и т. Д.). Поэтому я подозреваю, что попытка разобрать страницу с помощью XPath может не сработать для вас.

Я бы поэтому подумал, что вам нужно прибегать к использованию регулярных выражений (что далеко от идеала) или даже использовать какой-то вариант String.indexOf («gmi-ResViewSizer_img»).

Надеюсь, это поможет.

EDIT

мне удалось получить что-то, что время от времени работает. Боюсь, что я еще не конвертирован в 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()); 

    } 
} 
+1

Но регулярные выражения? Ужас! – TrueWill

+0

Благодарим за внимание. Я собираюсь оставить вопрос открытым до завтра, если у кого-нибудь есть идеи по этому поводу. Глядя на усилия, которые вы вложили в него; Я думаю, вы правы. Когда вы посмотрели на него, могли ли вы найти какую-либо другую информацию на странице «просмотр одной кисти»? (название, ссылка для загрузки и т. д.) Я собираюсь включить javascript и посмотреть вокруг. (Всякий раз, когда я его включаю, он раздувает мое окно с трудночитаемой информацией) – StartingGroovy