Как использовать Xpath в PostgreSQL для извлечения атрибутов html?

#html #xml #postgresql #parsing #xpath

Вопрос:

Я имею дело со столбцом, в котором просто хранятся теги HTML href в формате, показанном ниже. Кроме тегов href, других тегов нет.

<a href='https://www.website1.ca/en/Section1/Section2/Section3/Section-4---Section5-R-Zone.pdf'>B4</a>

Я пытаюсь извлечь ссылку из HTML-тега: https://www.website1.ca/en/Section1/Section2/Section3/Section-4—Section5-R-Zone.pdf

Я не уверен, какое выражение Xpath использовать. Я попытался использовать следующее, чтобы получить значение внутри атрибута HTML, но, похоже, это не работает.

 select
xpath(
'/href',
$<a href='https://www.website1.ca/en/Section1/Section2/Section3/Section-4---Section5-R-Zone.pdf'>B4</a>$,
'/@href'
); 
 

Существует ли выражение xpath для получения значения внутри атрибута HTML?

Ответ №1:

Ваш запрос XPATH неверен. Используйте этот запрос, чтобы получить все href атрибуты всех a тегов:

 SELECT xpath(
          '//a/@href',
           $<a href='https://www.website1.ca/en/Section1/Section2/Section3/Section-4---Section5-R-Zone.pdf'>B4</a>$
       );

                                          xpath                                          
═════════════════════════════════════════════════════════════════════════════════════════
 {https://www.website1.ca/en/Section1/Section2/Section3/Section-4---Section5-R-Zone.pdf}
(1 row)
 

В результате получается массив со всеми результатами (таких тегов может быть несколько).

Комментарии:

1. Спасибо за ответ! Что делать, если есть два атрибута href, которые необходимо проанализировать. Есть ли способ сделать все одно в запросе? Например: <a href=’ B4 website1.ca/en/Section1/Section2/Section3/… >, ><a href=’ (26) website2.ca/en/section1/section2/section3/… >. Есть ли способ получить два URL-адреса, например: ‘ website1.ca/en/Section1/Section2/Section3/… ‘ КАК URL1 И ‘ website2.ca/en/section1/section2/section3/… ‘ КАК URL2.

2. Это будет работать просто отлично и вернет оба значения. Если вам не нужен массив, используйте unnest .