2017-01-02 6 views
0

Недавно я попытался работать с JSoup для анализа HTML-документов, я прошел через Turorial на JSoup и обнаружил, что select-Method может быть тем, что я ищу.JSoup Выбрать тег Рекурсивный поиск

Что я пытаюсь выполнить, так это найти все элементы в html-документе, которые обладают определенным классом. Чтобы проверить это, я попробовал это на веб-странице Amazon (идея: найти все сделки с определенными предложениями).

Итак, я проверил веб-страницу, чтобы узнать, какие классы и идентификаторы используются, а затем я попытался интегрировать это в небольшой фрагмент кода. В этом примере я нашел follwing элемента:

<span id="dealTitle" class="a-size-base a-color-link dealTitleTwoLine restVisible singleCellTitle autoHeight">PROCAVE Matratzen-Brücke aus Schaumstoff 25 x 200 cm für ...</span> 

Этого элемент встроен в других элементах, и существует несколько раз (для каждой сделки, конечно). Итак, вот мой код, чтобы прочитать элементы сделки:

Document doc = Jsoup.connect("https://www.amazon.de/gp/angebote/ref=gbph_ftr_s-8_cd61_page_1?gb_f_LD=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL%252CUPCOMING,dealTypes:LIGHTNING_DEAL,page:1,sortOrder:BY_SCORE,dealsPerPage:8&pf_rd_p=425ddcb8-bed4-4e85-ac0f-c1a79d14cd61&pf_rd_s=slot-8&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A3JWKAKR8XB7XF&pf_rd_r=BTHRY008J9N3N5CCMNEN&gb_f_second=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL,dealTypes:COUPON_DEAL,page:8,sortOrder:BY_SCORE,dealsPerPage:8").timeout(0).get(); 

      Elements deals = doc.select("span.a-size-base.a-color-link.dealTitleTwoLine.restVisible.singleCellTitle.autoHeight"); 

      for (Element deal : deals) { 
       if (deal.text().contains("ItemMatch")) { 
        System.out.println("Found deal: " + deal.text()); 
       } 
      } 

К сожалению, я не могу получить элемент, который я ищу. сделок всегда имеет размер 0. Я попытался изменить свой выбор только с помощью части классов, добавил атрибут id и так далее. Тем не менее, я не получаю элементы (в этом случае они вложены в некоторые другие). Если я попробую элемент, который находится над этим элементом в иерархии DOM (например, div с классом «a-section a-spacing-none slotContainer»), это будет найдено.

я на самом деле нужно указать всю иерархию DOM (с помощью «>» в ​​моих отборных выражениях делать? Я ожидал, чтобы быть в состоянии определить селектор и JSoup бы траверс и искать все DOM-дерево.

+0

Если на ваш вопрос достаточно ответили, вы должны подумать о том, чтобы принять наилучший ответ и тем самым поставить этот вопрос в соответствие с решением. Если вам нужна дополнительная помощь, укажите, с чем вам нужна помощь. – luksch

ответ

0

Нет, вам не нужно указывать полную иерархию DOM. Ваш тест должен работать, если эти элементы действительно являются частью DOM. Я подозреваю, что они не могут быть частью DOM, поскольку он загружается JSoup. Причина может быть, что внутренние узлы DOM заполнены JavaScript через AJAX. JSoup не запускает JavaScript, поэтому динамически загруженные части DOM недоступны. Для достижения того, что вы хотите, вы можете напрямую заглянуть в вызовы AJAX и проанализировать их или переместить на другое решение, такое как selenium webdriver, в котором работает настоящий браузер, включая работу JavaScript.

+0

Да, вы правы, это из-за JS/AJAX. Спасибо, что перенаправил меня на selenium webdriver, вместо этого попробую. –