Я соскабливаю веб-сайт для определенных фрагментов информации. Кусок HTML, что я ищу является следующее:Скребок HTML с XPath за один проход
1. <div class="data">
2. <a class="anchor" name="123"></a>
3. <a class="image_link" id="image_id" href="http:/link1">
4. <img class="mainimg" id="456" src="http://link2" alt="description" title="title" >
5. </a>
6. </div>
Веб-страница имеет, конечно, много этих <div class="data">
, и я хочу, чтобы очистить все из них следующую информацию:
- имя = 123 (от линии 2)
- HREF = link1 (от линии 3)
- SRC = HTTP: // ссылка2, альт = описание (от линии 4)
Я могу это сделать, но с использованием 3-х различных выражений XPath, например, так:
Object[] o1 = node.evaluateXPath("//div[@class='data']/a/img");
Object[] o2 = node.evaluateXPath("//div[@class='data']/a[@class='image_link']");
Object[] o3 = node.evaluateXPath("//div[@class='data']/a[@class='anchor']");
, а затем получить каждый атрибут, как, например:
((TagNode)o1[i]).getAttributeByName("src");
Это работает, но я 3 раза и через три различные и отдельные структуры данных с необходимой мне информацией.
Как я могу оптимизировать это только с 1 выражением xpath? Благодарю.
Объединение двух или более выражений, начиная с '' // скорее всего, потребует двух или более полных обходов дерева XML. Я считаю, что OP спрашивает, есть ли способ выбрать все узлы всего за один проход над деревом XML. –
@DimitreNovatchev - Согласовано. Я думаю, что у ОП есть три проблемы: 1) необходимы множественные выражения; 2) создаются и должны быть проверены несколько структур данных; 3) требуется несколько проходов документа. Мое решение адресовано # 1 и # 2; Я не уверен, что №3 можно решить в одном выражении. –
Прежде всего, спасибо за ответ.Моя главная задача - оптимизировать мой текущий код, так как он занимает около 3 секунд, чтобы проанализировать весь документ с моим текущим подходом. Я попытаюсь использовать объединение выражений, а не использовать HTMLCleaner, чтобы увидеть, есть ли улучшения в производительности. – Henrique