Как проанализировать HTML-документ на предмет списка элементов ‘tagname’ с помощью Jsoup?

#java #jsoup

#java #jsoup

Вопрос:

У меня постоянные проблемы с анализом HTML-страницы на предмет длинных тегов с помощью Jsoup. В моем случае я пытаюсь извлечь <ytd-video-renderer> элементы со страницы поиска YouTube. Сколько бы способов я ни пробовал. Надежный или непустой список не возвращается.

Вещи, которые я пробовал до сих пор, каждая для объекта HTML Document doc .

.select("ytd-video-renderer") (Безрезультатно, список пуст.)

.getElementsByClass("ytd-item-section-renderer") (Класс, встречающийся только в ytd-video-renderer )

.select("ytd-video-renderer.ytd-item-section-renderer")

.select("ytd-video-renderer[class*=ytd-item-section-renderer]")

.select("div#dismissable) (единственный раздел под ytd-video-renderer )

И многое другое с параметрами…

Я также попробовал использовать любые другие теги, но у меня возникают те же проблемы.

ближе всего я подошел к успеху, было: .select(a[href*=watch]) . Это возвращает все заголовки видео. Но, к сожалению, также некоторые другие ссылки с другим текстом. Таким образом, ненадежно.

У меня установлена Java 8 и последняя версия Jsoup.

Вот код, реализующий Jsoup:

 public class SearchPage {
    private Document doc;
    public SearchPage(String url){
        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException ex) {
            //taking care of my error cats
        }
    }
    public Elements test(){  //just to test
        return doc.getElementsByTag("ytd-item-renderer");
    }
}
  

Пример того, что я пытаюсь извлечь:
Изображение HTML-блоков, которые я ищу

Кажется, что я чего-то не понимаю, поскольку многие говорят, что Jsoup потрясающий и простой … (тогда не в моем случае: v)

Что я хотел бы видеть, так это каждый элемент, который я запрашиваю, в списке. Далее я хочу снова проанализировать каждый элемент, но давайте сначала решим это. Надеюсь, это даст мне ноу-хау для решения остальных. Прямо сейчас я получаю пустой список каждый раз.

Большое вам спасибо.

Ответ №1:

Содержимое страницы поиска Youtube, на которую вы смотрите, отображается вашим браузером с помощью Javascript. Строка Jsoup.connect(url).get() получит только HTML-содержимое страницы, она не будет выполнять никакого Javascript. Если вы запросите страницу с помощью cURL или какого-либо другого инструмента командной строки, вы обнаружите, что элементов, которые вы ищете, там нет.

Я не уверен точно, какова ваша цель, но вы можете захотеть заглянуть в YouTube API, чтобы посмотреть, есть ли более простой способ сделать то, что вы хотите.

Комментарии:

1. Большое спасибо. Похоже, что это было бы так. Я изучаю другие методы, и API YouTube действительно может работать здесь лучше.