Не найти правильный xpath
Я пытаюсь написать скрипт на Python, чтобы получить информацию о продуктах Google, перечисленных в правом верхнем углу экрана. (Обычно 6 картинок с ценой и продавцом)
Я использую Python, PhantomJS и Selenium
Делая поиск в Google для "красной обуви", я хочу, чтобы мой скрипт возвращал цены. Я застреваю на этапе, когда пытаюсь найти элемент, содержащий продукты. Я что-то упустил с моим xpath?
def getTopSongs(object):
print "Working YETI"
browser = webdriver.PhantomJS('c:/projects/phantomjs/phantomjs.exe')
browser.get('http://google.com/search?q=red+shoe')
time.sleep(5)
title = browser.find_element_by_xpath('//div[contains@class, "pla-unit")]/text()[contains(., "red")]/following::b').text
С веб-страницы Google я размещаю под несколькими вложенными
<div id="rhs">
...
<div class="_Pwb">
<div class="_Ohb">
<div style="width:109px" class="pla-unit">
<div class="_PD">
<div class="pla-unit-img-container">
<div class="_Z5">
<div class="_vT"><a href="http://www.somewebsite.com">
<span class="rhsl4">Nina 'Forbes' Peep Toe Pump <b>Red</b> R...</span>
<span class="rhsg3 rhsl5">Nina 'Forbes' Peep Toe Pum...</span>
<span class="rhsg4">Nina 'Forbes' Peep Toe Pu...</span></a>
</div>
<div class="_QD"><b>$78.95</b></div>
<div class="_mC">
<span class="rhsl4 a">Nordstrom</span>
<span class="rhsg3 rhsl5 a">Nordstrom</span>
<span class="rhsg4 a">Nordstrom</span>
</div>
</div>
* Обновление: я добавил больше HTML. В этом примере я хочу получить текст от ($78,95) и (Norstrom)
* Обновление Чтобы уточнить,
<div id="rhs">
это уникальный элемент
Однако есть несколько (6) элементов:
<div style="width:109px" class="pla-unit">
Элементы в каждой категории имеют одинаковое имя и имеют одинаковую структуру и подструктуры, т.е.
<div class="_PD">
<div class="pla-unit-img-container">
<div class="_Z5">
<div class="_vD">
<div class="_QD">
<div class="_mC">
и так далее.
Основная цель - получить все элементы, но для отладки я попросил помочь получить первый.
Xpath для единицы цены с использованием XPathChecker в Firefox: id('rhs_block')/x:div[1]/x:div/x:div/x:div/x:div[1]/x:div[1]/ х: DIV [2]/ х: DIV [2]/ х: б
1 ответ
Вы можете использовать ancestor::, чтобы вернуться вверх, затем follow-sibling::, чтобы получить элементы на том же уровне, что и после него.
Я не пробовал это, но дать ему шанс:
title = browser.find_element_by_xpath('//div[contains@class, "pla-unit")]/text()[contains(., "red")]/ancestor::div/following-sibling::div[1]').text
Затем, чтобы добраться до вашего div class ='mC', просто измените:
following-sibling::div[1]
в
following-sibling::div[2]
и получить текст из промежутков под этим.