2017-03-25 4 views
1

Ich versuche, diese Seite zu analysieren.HtmlUnit: anchor.click ändert nicht Seite

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

Ich möchte Informationen in der Tabelle erhalten, indem Sie auf auf einen der Linie über/unter oder vergleichen Chancen zu bekommen. Mein Ziel ist es, einen Tisch von über +5,5 zu bekommen.

Es ist mir gelungen, HtmlAnchor und OnClickAttribute zu bekommen, aber dann wird keine neue Seite geladen und natürlich ist der Link der Seite derselbe wie der ursprüngliche.

Hier ist ein Teil des Codes, den ich verwende.

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; 
    } 
} 

Kann mir jemand helfen, eine Lösung zu finden oder einen anderen Ansatz zu finden?


EDIT:

Dank für die Antwort. Ich habe Ihren Code ausprobiert, aber ich bekomme einen Fehler in der Bedingung (Typ stimmt nicht überein: kann vom Elementtyp Capture # 1-of nicht in HtmlElement konvertiert werden).

Auf jeden Fall habe ich versucht, den Code innerhalb geschrieben zu verwenden, wenn: stil die gleiche URL

 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()); 

      } 
     } 

Aber url ist und eine dann Null-Zeiger-Ausnahme beim Drucken table.asText().


Mein Ziel ist es, Quoten von der Website zu bekommen. Ich möchte mit allen Spielen radeln. Meine Erwartung ist, Chancen für 1X2 und U/O 5,5 für alle Spiele zu bekommen. Der Fehler, den ich bekommen, ist, dass dieser Teil des Codes

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

return 0 und so kann ich nicht Tisch.

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

Bitte geben Sie einen [complete] (https://stackoverflow.com/help/mcve) Fall an, der erklärt, was der Fehler ist und was die Erwartungen sind –

+0

Ich aktualisiere mit vollem Fall. Jetzt (und ich weiß nicht warum) bemerkte ich, dass sogar tabUO.click(); lädt keine neue Seite. Ich war mir sicher, dass es geladen wurde. –

+0

Endlich habe ich gelöst. Problem war, dass ich tabUO.onmouseDown() aufrufen muss, da das Attribut onmousedown ist. Ich denke, dass ich vorherige Version von htmlunit gab es diese Methode nicht, oder ich konnte es nicht finden. Wie auch immer, vielen Dank für Ihre Hilfe! –

Antwort

0

Wenn Sie auf realen Browser klicken, wird die Seite die gleiche, aber die URL ändert.

Das gleiche ist mit HtmlUnit getan:

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()); 
     } 
    } 
} 

In XPath, . von diesem Knoten bedeutet, / direktes Kind bedeutet, und // bedeutet rekursiv Kinder oder Enkel, und @class='more' Mittel class mit Wert more Attribut finden .

+0

Vielen Dank für Ihre Antwort und Erklärung. Ich habe deinen Code ausprobiert, aber er funktioniert nicht. Oben habe ich einige detalis hinzugefügt. –

+0

Der Code funktioniert mit [letzter Schnappschuss] (https://ci.canoo.com/teamcity/viewLog.html?buildTypeId = HtmlUnit_FastBuild & buildId = lastSuccessful & tab = Artefakte), bitte probieren Sie es aus –

+0

Ich habe es mit der neuesten Version versucht. Es gibt keinen Fehler mehr, aber es funktioniert sowieso nicht. Ich habe versucht, einfach mit deinem Code ein neues, einfacheres Programm zu schreiben, und es funktioniert, aber wenn ich es in komplexeren Code lege, bekomme ich diese Seitengröße. getByXPath ("// a [@ class = 'more']") ist 0. Haben Sie eine Idee? Vielen Dank für Ihre Hilfe. –