JSoup Scraping на основе пользовательских атрибутов - PullRequest
0 голосов
/ 24 сентября 2019

Так что я использую JSoup для очистки сайта, который создает кучу div с динамическими именами классов (они меняют каждую перезагрузку), но с одинаковыми именами атрибутов.Например:

<div class="[random text here that changes] js_resultTile" data-listing-number="[some number]">
    <div class="a12_regularTile js_rollover_container " itemscope itemtype="http://schema.org/Product" data-listing-number="[same number here]">
        <a href...

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

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = doc.select("div[data-listing-number]");

Я пробовал по классу:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = doc.getElementsByClass("a12_regularTile")

И:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = doc.select("div[class*=js_resultTile]")

Я пробовал другой метод атрибута:

Document doc = Jsoup.connect([theUrl]).get();
Elements myEls = new Elements();
for (Element element : doc.getAllElements() )
        {
            for ( Attribute attribute : element.attributes() )
            {
                if ( attribute.getKey().equalsIgnoreCase("data-listing-number"))
                {
                    myEls.add(element);
                }
            }
        }

Ни одна из этих работ.Я могу выбрать документ, который получает весь HTML, но мой объект myEls всегда пуст.Что я могу использовать для выбора этих элементов?

1 Ответ

1 голос
/ 24 сентября 2019

Вы уверены, что эти элементы присутствуют в HTML, возвращаемом сервером?Они могут быть добавлены позже с помощью JavaScript.Если в представлении страницы задействован JavaScript, вы не сможете использовать Jsoup.Более подробно в моем ответе на подобный вопрос здесь: JSoup: Трудности при извлечении одного элемента

И еще один совет.Вместо того, чтобы использовать вашу конструкцию для «for-for-if», вы можете использовать это:

    for (Element element : doc.getAllElements()) {
        if (element.dataset().containsKey("listing-number")) {
            myEls.add(element);
        }
    }
...