Не найти правильный 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]

и получить текст из промежутков под этим.

Другие вопросы по тегам