Я пытаюсь разобрать веб-сайт с HtmlUnit и Jsoup, и я столкнулся с этой проблемой. У меня разные страницы для разбора, и я сохранил эти ссылки этих страниц в массиве строк. Я хочу, чтобы цикл на длину массива и проанализировать каждую страницу, и я иду таким образом.HtmlUnit: открытие новой страницы с тем же WebClient
1) Для петли на длину массива Линка 2) Открытие нового WEBClient 3) Создание нового HTMLPage от связи с методом GetPage 4) Синтаксического и получать некоторые элементы 5) Закрытия WebClient 6) вернуться к 2).
Таким образом, я получаю то, что хочу, но код немного медленный. Поэтому я попытался открыть и закрыть webClient вне цикла for. Как это:
1) Открытие нового WebClient 2) Для петли по длине массива Линка 3) Создание нового HTMLPage от связи с методом GetPage 4) Анализ и получить некоторые элементы 5) вернуться к 2) , 6) Закрытие webclient
Это намного быстрее, но я не получаю одинаковых результатов предыдущего пути.
Неправильно использовать конструктор webclient таким образом?
EDIT: После кода я тестирование:
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
// TODO Auto-generated method stub
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
String[] links = {"http://www.oddsportal.com/tennis/china/atp-beijing/murray-andy-dimitrov-grigor-fTdGYm3q/#cs;2;6",
"http://www.oddsportal.com/tennis/china/atp-beijing/murray-andy-dimitrov-grigor-fTdGYm3q/#cs;2;9"};
String bm = null;
String[] odds = new String[2];
//Second way
WebClient webClient = new WebClient(BrowserVersion.CHROME);
System.out.println("Client opened");
for (int i=0; i<links.length; i++) {
HtmlPage page = webClient.getPage(links[i]);
System.out.println("Page loaded");
Document csDoc = Jsoup.parse(page.asXml());
System.out.println("Page parsed");
Element table = csDoc.select("table.table-main.detail-odds.sortable").first();
Elements cols = table.select("td:eq(0)");
if (cols.first().text().trim().contains("bet365.it")) {
bm = cols.first().text().trim();
odds[i]=table.select("tbody > tr.lo").select("td.right.odds").first().text().trim();
}
else {
Elements footTable = csDoc.select("table.table-main.detail-odds.sortable");
Elements footRow = footTable.select("tfoot > tr.aver");
odds[i] = footRow.select("td.right").text().trim();
bm = "AVG";
}
webClient.close();
}
System.out.println(bm +"\t" +odds[0] + "\t" + odds[1]);
}
Если я запускаю этот код результаты правильно. Если я перемещаю webClient.close(); результаты вне цикла for не верны. В частности, коэффициенты [0] равны коэффициентам [1];
'но я не получаю одинаковые результаты предыдущего пути', слишком общий; пожалуйста, уточните, каким образом результаты разные. –
Вы получаете какие-либо «Исключения»? –
@FredericKlein in for loop Я получаю некоторые данные, которые храню в массиве odds. если я запустил код, я разместил это значение, все элементы массива будут одинаковыми, а если я запустим один и тот же код, но создав webclient внутри цикла for, элементы массива будут разными (как и должно быть). Пример: 1) с WebClient внутри для цикла я получить (для Exemple) коэффициентов [0] = 4,00 коэффициентов [1] = 3.00 коэффициентов [2] = 5,50 шансов [3] = 7.50 2) с WebClient снаружи цикл for i получается (например) коэффициенты [0] = 4.00 коэффициенты [1] = 4.00 коэффициенты [2] = 4.50 коэффициенты [3] = 4.00 Кажется, что это не загрузка правой страницы –