Jsoup: выбирать только ссылки с text() равным

Один из способов отобрать ссылки с помощью text(), равных некоторым предопределенным строкам, прост:

Elements links = document.getElementsByTag("a");               
for (Element link : links) {
    if (link.text().equals("So & so") || link.text().equals("such & such") {
        // add link.attr("href") to our container;
    }
}                   

Но по мере роста количества условий text() этот подход выглядит все менее и менее эффективным.

Есть ли лучший способ сделать это в Jsoup?


person ef2011    schedule 06.09.2011    source источник


Ответы (1)


Это не имеет ничего общего с Jsoup, но почему бы не использовать набор, такой как HashSet, для хранения ваших действительных строк? Затем, если бы набор назывался «validTextSet», вы могли бы просто и эффективно проверить, находится ли текст в наборе с помощью

     if (validTextSet.contains(link.text())) {
        // add link.attr("href") to our container;
     }
person Hovercraft Full Of Eels    schedule 06.09.2011
comment
Это определенно улучшение производительности, и кажется, что в Jsoup еще нет такого механизма, поэтому я скоро соглашусь. Интересно, что, несмотря на все большие достижения в языках программирования более высокого уровня, старый метод «C» реализации нецелочисленного переключателя/регистра через массив указателей на функции по-прежнему верен в Java (замаскированно). +1 от меня тоже. - person ef2011; 06.09.2011
comment
@ ef2011: Я не удивлен, что этого нет в Jsoup, поскольку на самом деле это не часть синтаксического анализа HTML, а скорее то, что вы делаете с информацией после ее получения. Кроме того, я думаю, что HashMap теоретически быстрее, чем переключатель / регистр, но я могу ошибаться. - person Hovercraft Full Of Eels; 06.09.2011
comment
Это именно то, что я имел в виду. Оптимизированный переключатель/регистр в 'C' на самом деле является замаскированным HashMap (хэш используется как индекс мгновенного доступа к массиву). - person ef2011; 06.09.2011