Мы предполагаем, что используется Google Chrome или Яндекс.Браузер. Для работы в Firefox желательно предварительно установить дополнения Firebug и Firepath.
XPath или XML Path Language — это язык запросов к элементам XML- и HTML-документов. Запрос нужен затем, чтобы получить из этих документов какую-то нужную нам информацию. Допустим, у нас есть следующая веб-страница
и мы хотим узнать из нее дату создания аннотации, хранящуюся в элементе <
p>
с идентификатором date (01.01.2015).
Проследим путь к этому элементу от начала документа:
<
html>
-- все содержимое страницы, в том числе и дата, находится внутри этого элемента;<
body>
- сузим область поиска до «тела» страницы;<
div>
- дата содержится в первом из двух подобных элементов;<
p>
- дата находится внутри абзаца. Второй<
div>
сразу отпадает – в нем нет абзацев;- абзац с идентификатором (
id
) date.
Запишем этот путь следующим образом:
/html/body/div/p[@id='date']
Это и будет запрос XPath – путь к нужному нам элементу.
Одиночный слеш «/» в начале означает, что путь – абсолютный, т.е. от начала документа.
В квадратных скобках возле p
стоят дополнительные условия поиска. Нам ведь нужны не все абзацы внутри <
div>
, а только абзац с заданным id
. Если бы нам понадобилось найти абзац, принадлежащий к заданному классу, то условие выглядело бы так: [@class='имя_класса']
. Например, путь:
/html/body/p[@class='abstract']
Указывает на второй абзац текста.
Одиночные кавычки вокруг имени класса или идентификатора существенны. Опускать их нельзя. Заменять на двойные кавычки тоже, чтобы не возникло путаницы с текстом команды XPath-запроса, которую вы будете задавать в консоли браузера
$x("/html/body/p[@class='abstract']")
Иначе
Абсолютный путь можно заменить относительным, т.е. путем от заданного места документа. Относительный путь начинается с двойного слеша «//». Например, //div
означает путь от предка элемента <
div>
, т.е. <
body>
, и в результате запроса
$x("//div")
Будут найдены оба элемента <
div>
. Точнее, запрос возвратит список из двух <
div>
-ов. Выбрать <
div>
, содержащий аннотацию, можно по его номеру: он 1-й в списке, а нумерация начинается с единицы
$x("//div[1]")
С помощью относительного пути запрос, возвращающий дату, сокращается до
$x("//div/p[@id='date']")
Но и этот путь можно сократить, ведь нужный нам абзац обладает уникальным именем date
:
$x("//p[@id='date']")
Комментарии
comments powered by Disqus