#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/3849byFx24. Я использую 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 и т.д. )