Jsoup: select () возвращает пустой, когда это не должно - PullRequest
4 голосов
/ 09 октября 2011

Я пытаюсь выбрать информационный блок на странице входа в Google в Википедии: http://en.m.wikipedia.org/wiki/Google

Итак, я звоню:

contentDiv = document.select("div[id=content]").first();

Что работает, как ожидалось, тогда я делаю:

Elements infoboxes = contentDiv.select("table[class=infobox]");

Затем я проверяю infoboxes.isEmpty(), и я ошеломлен, обнаружив, что он пуст!

Я проверил и убедился, что элемент contentDiv содержит следующее:

<table class="infobox vcard" style="width: 22em;" cellspacing="5">

Итак, почему contentDiv.select("table[class=infobox]") возвращает пустое значение?

ОБНОВЛЕНИЕ : я проверял выше с contentDiv.select("table[class=infobox vcard]"), и он отлично работает!Это странно, так как я знаю, что в отличие от записи table.infobox.vcard, которая выбирает только элемент точный мультикласс, table[class=infobox] должен выбирать все таблицы, в списке которых есть как минимум infoboxклассы.

Кстати, я тестировал код с другой записью в Википедии , содержащей:

<table class="infobox biota" style="text-align: left; width: 200px; font-size: 100%;">

И что contentDiv.select("table[class=infobox]") ведет себя точно так, как ожидалось, возвращая этоЭлемент таблицы в качестве первого элемента в infoboxes.

Есть идеи, почему несоответствие?Чем можно объяснить это странное поведение?

Возможно ли, что я только что наткнулся на ошибку Jsoup?

(я использую jsoup-1.5.2, не последнюю версию, но мне не нужна поддержка HTML5, и по разным причинам я не могу сразу перейти на последнюю версию 1.6.1).

1 Ответ

8 голосов
/ 10 октября 2011

Селектор [attributename=attributevalue] является точным совпадением. Это указывается в CSS-селекторе spec (выделено мной):

[att=val]
Соответствует, когда значение атрибута "att" элемента равно точно"val".

Вы хотите использовать [attributename~=attributevalue] вместо:

Elements infoboxes = contentDiv.select("table[class~=infobox]");
// ...

или, что еще лучше, селектор .classname:

Elements infoboxes = contentDiv.select("table.infobox");
// ...

Смотри также:


Что касается вашего теста с другой записью в Википедии, я не могу воспроизвести это. Но я могу сказать, что эта страница содержит еще один <table class="infobox">, который должен быть тем, который вы на самом деле извлекаете.

...