2011-01-25 9 views
1

В JSoup следующий тестовый пример должен пройти, это не так.JSoup не перевод ampersand в ссылках в html

@Test 
public void shouldPrintHrefCorrectly(){ 
    String content= "<li><a href=\"#\">Good</a><ul><li><a href=\"article.php?boid=1865&sid=53&mid=1\">" + 
      "Boss</a></li><li><a href=\"article.php?boid=186&sid=53&mid=1\">" + 
      "heavent</a></li><li><a href=\"article.php?boid=167&sid=53&mid=1\">" + 
      "hellos</a></li><li><a href=\"article.php?boid=181&sid=53&mid=1\">" + 
      "Mr.Jackson!</a></li>"; 

    Document document = Jsoup.parse(content, "http://www.google.co.in/"); 
    Elements links = document.select("a[href^=article]"); 
    Iterator<Element> iterator = links.iterator(); 
    List<String> urls = new ArrayList<String>(); 
    while(iterator.hasNext()){ 
     urls.add(iterator.next().attr("href")); 
    } 

    Assert.assertTrue(urls.contains("article.php?boid=181&sid=53&mid=1")); 
} 

Может ли кто-нибудь из вас, пожалуйста, объяснить причину, почему он не работает?

ответ

1

Есть три проблемы:

  1. Вы утверждать, что есть параметр bovikatanid присутствует, в то время как на самом деле называется boid.

  2. Источник HTML использует источник & вместо &amp; в источнике. Это технически недействительно.

  3. Jsoup разобрал &mid как | как-то. Он должен был сканировать до ;.

Чтобы исправить № 1, вы должны сделать это сами. Чтобы исправить №2, вы должны сообщить об этой проблеме серверному вопросу (это их вина, однако, поскольку средний браузер прощает это, я бы предположил, что Google делает это, чтобы сэкономить полосу пропускания). Чтобы исправить №3, я сообщил an issue парню Jsoup, чтобы узнать, что он думает об этом.


Update: см, Джонатан (Jsoup парень) зафиксировал его. Это будет в следующем выпуске.

+1

Отличный обзор кода. Спасибо, что подняли проблему с JSoup. Хотелось бы работать с таким человеком, как вы. – Antony

+1

Спасибо BalusC. Я исправил проблему unscape Jsoup, и она будет доступна в следующей версии. –