找不到正确的xpath

时间:2014-09-24 21:23:19

标签: selenium xpath xpath-2.0

我正在尝试编写Python脚本,以便从屏幕右上角列出的Google产品中获取一些信息。 (通常有价格和卖家的6张图片)

我正在使用Python,PhantomJS和Selenium

谷歌搜索"红鞋"我希望我的脚本能够返回价格。我陷入了试图找到包含产品的元素的步骤。我的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的网页I元素下的几个嵌套

<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">

每个类别下的元素具有相同的名称,并遵循相同的结构和子结构 即,有6个

 <div class="_PD">
  <div class="pla-unit-img-container">
 <div class="_Z5">
  <div class="_vD">
  <div class="_QD">
  <div class="_mC">

等等。

主要目标是获取所有元素,但出于调试的目的,我正在寻求帮助以获得第一个元素。

在Firefox上使用XPathChecker的价格单位的xpath是:     ID(&#39; rhs_block&#39;)/ X:DIV [1] / X:DIV / X:DIV / X:DIV / X:DIV [1] / X:DIV [1] / X:DIV [2 ] / X:DIV [2] / X:乙

1 个答案:

答案 0 :(得分:0)

你可以使用ancestor :: to up up then then-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]

并从中获取文本。