Я отвечал на некоторые вопросы викторины для интервью, и вопрос был о том, как мне делать скрининг экрана. То есть, выбирая контент с веб-страницы, предполагая, что у вас нет более структурированного способа прямого запроса информации (например, веб-службы).
Мое решение было использовать выражение XQuery . Выражение было довольно длинным, потому что содержимое, которое мне было нужно, было довольно глубоко в иерархии HTML. Мне пришлось честно искать среди предков, прежде чем я нашел элемент с атрибутом id
. Например, очистка страницы Amazon.com для измерений продукта выглядит следующим образом:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
Это довольно неприятное выражение, но именно поэтому Amazon предоставляет API веб-службы. Во всяком случае, это только один пример. Вопрос был не об Амазоне, а о соскобе экрана.
Интервьюеру не понравилось мое решение. Он думал, что это хрупко, потому что изменение в дизайне страницы Amazon может потребовать переписать выражение XQuery. Трудно отладить выражение XQuery, которое не совпадает ни с чем на странице, к которой он применяется.
Я не согласился с его заявлениями, но я не думал, что его решение улучшилось: он подумал, что лучше использовать регулярное выражение , и искать контент и разметку рядом с весом доставки. Например, используя Perl:
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
Мой контраргумент заключался в том, что Amazon также может изменить свой HTML-код. Они могут записывать теги HTML прописными буквами (<LI>
), добавлять атрибуты CSS, изменять <b>
на <span>
или изменять метку «Размеры продукта:» на «Размеры:» или многие другие виды изменений. Моя точка зрения заключалась в том, что регулярные выражения не решают слабые места, которые он выявил в моем решении XQuery.
Но кроме того, регулярные выражения могут находить ложные срабатывания, если вы не добавите в выражение достаточно контекста. Он также может непреднамеренно соответствовать содержимому, которое находится внутри комментария, или в строке атрибута, или в разделе CDATA.
У меня вопрос, какую технологию вы используете для очистки экрана? Почему вы выбрали это решение? Есть ли веская причина для его использования? Или никогда не использовать другой? Есть ли третий вариант помимо тех, что я показал выше?
PS: Предположим, что нет API веб-службы или другого более прямого способа получения желаемого контента.