2017-03-25 3 views
1

このページを解析しようとしています。HtmlUnit:anchor.clickはページを変更していません

http://www.oddsportal.com/hockey/czech-republic/extraliga/plzen-liberec-QaikxB6H/#over-under;2

私は1つが下/上行の1つをクリックすることで取得したり、オッズを比較することができ、テーブル内の情報を取得したいと思います。私の目標は、テーブルを上から/下から+5.5にすることです。

HtmlAnchorとOnClickAttributeの取得に成功しましたが、新しいページが読み込まれず、もちろんページのリンクは元のものと同じです。

ここに私が使用しているコードの一部があります。

WebClient webClient = new WebClient(BrowserVersion.CHROME); 
webClient.getOptions().setJavaScriptEnabled(true); 
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
webClient.getOptions().setThrowExceptionOnScriptError(false); 


.... 

List<HtmlElement> links = div.getElementsByAttribute("a", "class", "more"); 

for (int k = 0; k<links.size(); k++) { 
    if (links.get(k).getOnClickAttribute().toString().contains("P-5.50")) { 
     links.get(k).click(); 
     webClient.waitForBackgroundJavaScript(10000); 
     webClient.waitForBackgroundJavaScriptStartingBefore(10000); 
     System.out.println(page1X2.getUrl().toString()); 

     file = new File("./test3.csv"); 
     fw = new FileWriter(file.getAbsoluteFile()); 
     bw = new BufferedWriter(fw); 
     bw.write(page1X2.asText()); 
     bw.close(); 
     System.out.println("Done"); 

     break; 
    } 
} 

誰かが解決策を見つけたり、別の方法を見つけたりできますか?


EDIT:

が返事をいただきありがとうございます。あなたのコードを試しましたが、条件のエラーが発生しました(型の不一致:要素タイプのキャプチャから#1をHtmlElementに変換できません)。

はとにかく私は場合は、内部の投稿コードを使用しようとしました:table.asTextを印刷するとき

 List<HtmlElement> links = div.getElementsByAttribute("a", "class", "more"); 

     for (HtmlElement anchor : links) { 
      if (anchor.getOnClickAttribute().contains("P-5.50")) { 
       anchor.click(); 
       HtmlElement parent = (HtmlElement) anchor.getParentNode().getParentNode().getParentNode(); 
       HtmlTable table = parent.getFirstByXPath(".//table"); 
       System.out.println(page1X2.getUrl().toString()); 
       System.out.println(table.asText()); 

      } 
     } 

しかし、urlはSTIL同じURL、その後、nullポインタ例外です()。


私の目標は、ウェブサイトからオッズを得ることです。私はすべての試合を繰り返していきたいです。私の期待は、alla試合のために1X2とU/O5.5のオッズを得ることです。私が得るエラーは、この部分のコードです

 System.out.println(page1X2.<HtmlElement>getByXPath("//a[@class='more']").size()); 

戻り値0私はテーブルを取得できません。

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.text.DecimalFormat; 
import java.text.DecimalFormatSymbols; 

import java.util.List; 
import java.util.Locale; 
import java.util.logging.Level; 

import org.apache.commons.logging.LogFactory; 

import com.gargoylesoftware.htmlunit.BrowserVersion; 
import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider; 
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; 
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController; 
import com.gargoylesoftware.htmlunit.Page; 
import com.gargoylesoftware.htmlunit.ScriptResult; 
import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.html.DomElement; 
import com.gargoylesoftware.htmlunit.html.DomNodeList; 
import com.gargoylesoftware.htmlunit.html.HtmlAnchor; 
import com.gargoylesoftware.htmlunit.html.HtmlDivision; 
import com.gargoylesoftware.htmlunit.html.HtmlElement; 
import com.gargoylesoftware.htmlunit.html.HtmlPage; 
import com.gargoylesoftware.htmlunit.html.HtmlTable; 
import com.gargoylesoftware.htmlunit.html.HtmlTableBody; 
import com.gargoylesoftware.htmlunit.html.HtmlTableDataCell; 
import com.gargoylesoftware.htmlunit.html.HtmlTableFooter; 
import com.gargoylesoftware.htmlunit.javascript.host.URL; 

public class prova { 

/** 
* @param args 
* @throws IOException 
* @throws MalformedURLException 
* @throws FailingHttpStatusCodeException 
* @throws InterruptedException 
*/ 
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException { 

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 

    DecimalFormat df = new DecimalFormat("#,##0.00"); // decimali con virgola 
    df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ITALY)); 

    WebClient webClient = new WebClient(BrowserVersion.CHROME); 
    webClient.getOptions().setJavaScriptEnabled(true); 
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 

    String serie = "extraliga"; 
    String pagina = "1"; 
    String nation = "czech-republic"; 
    String s = "http://www.oddsportal.com/hockey/"+nation+"/"+serie+"/results/#/page/"+pagina+"/";  


    HtmlPage myPage = webClient.getPage(s);  
    final HtmlDivision htmldiv = myPage.getHtmlElementById("tournamentTable"); 
    final HtmlTable htmltable = (HtmlTable) htmldiv.getElementsByTagName("table").get(0); 
    List<HtmlTableDataCell> matches = htmltable.getElementsByAttribute("td", "class", "name table-participant"); 

    for (int i=0; i < matches.size(); i++) { 

     String link = "http://www.oddsportal.com"+matches.get(i).getElementsByTagName("a").get(0).getAttribute("href"); 
     HtmlPage page1X2 = webClient.getPage(link); 

     // Quote 1X2 
     DomNodeList<HtmlElement> quote1X2 = getQuote1X2(page1X2); 
     System.out.println(quote1X2.get(1).asText() + "-" + quote1X2.get(2).asText() + "-" + quote1X2.get(3).asText()); 

     // get click 
     HtmlElement tabUO = page1X2.getHtmlElementById("tab-nav-main").getElementsByAttribute("a", "title", "Over/Under").get(0); 
     tabUO.click(); 

     System.out.println(page1X2.<HtmlElement>getByXPath("//a[@class='more']").size()); 
     for (HtmlElement anchor : page1X2.<HtmlElement>getByXPath("//a[@class='more']")) { 
      if (anchor.getOnClickAttribute().contains("P-5.50")) { 
       anchor.click(); 
       HtmlElement parent = (HtmlElement) anchor.getParentNode().getParentNode().getParentNode(); 
       HtmlTable table = parent.getFirstByXPath(".//table"); 
       System.out.println(table.asText()); 
      } 
     } 

    } 

    webClient.close(); 
} 

// FUNCTION 

private static DomNodeList<HtmlElement> getQuote1X2(HtmlPage matchPage) { 

     HtmlTableBody matchTable = (HtmlTableBody) matchPage.getElementsByTagName("tbody").get(0); 
     List<HtmlElement> row = matchTable.getElementsByTagName("tr"); 

     int j; 
     for (j = 0; j<row.size()-1; j++) { 
      if (row.get(j).getElementsByTagName("td").get(0).asText().trim().compareTo("bet365.it")==0) { 
       break; 
      } 
     } 

     DomNodeList<HtmlElement> quote = null; 
     if (j<row.size()-1) 
      quote = row.get(j).getElementsByTagName("td"); 
     else 
     { 
      HtmlTableFooter matchFootTable = (HtmlTableFooter) matchPage.getElementsByTagName("tfoot").get(0); 
      List<HtmlElement> averrow = matchFootTable.getElementsByAttribute("tr", "class", "aver"); 
      quote = averrow.get(0).getElementsByTagName("td"); 
     } 

    return quote; 

} 

}

+0

[完全](https://stackoverflow.com/help/mcve)ケースを提供し、エラーの内容と期待値は –

+0

です。完全なケースで更新します。今、(なぜ私は知らない)私はそれがtabUO.click();新しいページが読み込まれていません。私はそれが読み込まれていると確信していた –

+0

最後に私は解決しました。問題は、属性がonmousedownであるためtabUO.onmouseDown()を呼び出す必要があることでした。私はhtmlunitの以前のバージョンはこの方法がなかったと思うか、それを見つけることができませんでした。とにかく助けてくれてありがとう! –

答えて

0

あなたは本当のブラウザ上でクリックすると、ページは同じですが、URLが変更されます。 ./は、直接の子を意味し、このノードから意味、XPathので

try (WebClient webclient = new WebClient()) { 
    HtmlPage page = webclient.getPage("http://www.oddsportal.com/hockey/czech-republic/extraliga/plzen-liberec-QaikxB6H/#over-under;2"); 
    for (HtmlElement anchor : page.<HtmlElement>getByXPath("//a[@class='more']")) { 
     if (anchor.getOnClickAttribute().contains("P-5.50")) { 
      anchor.click(); 
      HtmlElement parent = (HtmlElement) anchor.getParentNode().getParentNode().getParentNode(); 
      HtmlTable table = parent.getFirstByXPath(".//table"); 
      System.out.println(table.asText()); 
      System.out.println(table.asXml()); 
     } 
    } 
} 

を、そして//は再帰的に子供や孫を意味し、@class='more'手段が値moreclass属性見つける:

同じことがHtmlUnitで行われます。

+0

お返事ありがとうございます。あなたのコードを試しましたが、うまくいきません。上記の私はいくつかのdetalisを追加しました。 –

+0

このコードは、[最新のスナップショット](https://ci.canoo.com/teamcity/viewLog.html?buildTypeId = HtmlUnit_FastBuild&buildId = lastSuccessful&tab =アーティファクト)、試してみてください –

+0

私は最新バージョンで試しました。それはもはやエラーではありませんが、とにかくそれは動作していません。私はあなたのコードだけで新しい簡単なプログラムを書こうとしましたが、それは動作しますが、もっと複雑なコードに入れると、そのページのサイズになります。 getByXPath( "// a [@ class = 'more']」)は0です。 ご存知ですか?助けてくれてありがとう –

関連する問題