Использование XPath для получения элемента из XML

#python #xml #xpath

#python #xml #xpath

Вопрос:

У меня есть XML, подобный следующему

 <li class="expandSubItem">
    <span class="expandSubLink">Popular Neighborhoods</span>
    <ul class="secondSubNav" style="top:-0.125em;">
        <li class="subItem">
            <a class="subLink" href="/Hotels-g187147-zfn7236765-Paris_Ile_de_France-Hotels.html">Quartier Latin Hotels</a>
        </li>
    </ul>
</li>
<li class="expandSubItem">
    <span class="expandSubLink">Popular Paris Categories</span>
    <ul class="secondSubNav" style="top:-0.125em;">
        <li class="subItem">
            <a class="subLink" href="/HotelsList-Paris-Cheap-Hotels-zfp10420.html">Paris Cheap Hotels</a>
        </li>
    </ul>
</li>
  

Я хочу получить все ссылки в разделе «Популярные категории Парижа». Я использовал что-то вроде этого //li//a/@href/following::span[text()='Popular Singapore Categories'] , но это не дало никаких результатов. Есть идеи, как получить правильный результат? Вот фрагмент кода python, который я написал.

 t_url = 'https://www.tripadvisor.com/Tourism-g187147-Paris_Ile_de_France-Vacations.html'
page = requests.get(t_url, timeout=30)
tree = html.fromstring(page.content)

links = tree.xpath('//li[span="Popular Paris Categories"]//a/@href')
print links
  

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

1. //li[span='Popular Paris Categories']/ul/li/a/@href

2. это не сработало, потому что «span» и «ul» находятся на одном уровне xpath.

3. Да, span и ul находятся на одном уровне, и это не имеет значения. Посмотрите демонстрационную версию (или попробуйте ее в любом тестере XPath, который вам нравится): xpatheval.apphb.com/3849byFx2

4. Я использую python для оценки xpath. Я включил код python, который я написал.

5. Убедитесь, что вы публикуете HTML, который вы на самом деле получаете из page.content , а не тот, который вы видите в браузере…

Ответ №1:

Это один из возможных способов :

 //li[normalize-space(span)="Popular Paris Categories"]//a/@href
  

Обратите внимание, как normalize-space() используется для удаления конечного пробела из span содержимого. Это причина, по которой XPath, который я предложил изначально в комментарии, не работал для вашего фактического HTML.

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

1. Да, вы правы. После «Популярных категорий Парижа» есть новая строка. Большое вам спасибо за вашу помощь.

Ответ №2:

Возможно, что-то вроде этого

 //span[text()='Popular Paris Categories']/following-sibling::ul//a/@href
  

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

1. @AgusSanjaya это должно сработать (см. демо на xpatheval.apphb.com/8524GG-JA ). В какой среде вы это запускаете? ( какой движок xpath и т.д. )