このページを解析しようとしています。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;
}
}
[完全](https://stackoverflow.com/help/mcve)ケースを提供し、エラーの内容と期待値は –
です。完全なケースで更新します。今、(なぜ私は知らない)私はそれがtabUO.click();新しいページが読み込まれていません。私はそれが読み込まれていると確信していた –
最後に私は解決しました。問題は、属性がonmousedownであるためtabUO.onmouseDown()を呼び出す必要があることでした。私はhtmlunitの以前のバージョンはこの方法がなかったと思うか、それを見つけることができませんでした。とにかく助けてくれてありがとう! –