使用Span内部的Selenium PhantomJS获取文本

时间:2017-06-05 04:52:52

标签: python selenium selenium-webdriver phantomjs

我尝试使用Seleniung webdriver PhantomJS在span中获取文本。我的代码是这样的:

href = driver.find_elements_by_xpath("//a[@class='_8mlbc _vbtk2 _t5r8b']")
for rt in href:
    rt.click()
    if href:
        name = driver.find_elements_by_xpath("//*[@class='_99ch8']/span").text
        # name = driver.find_element_by_xpath("//li[a[@title='nike']]/span").text
        print(name)

在HTML中:

<li class="_99ch8"><a class="_4zhc5 notranslate _ebg8h" title="nike" href="/nike/">nike</a><span><span>Nobody believed a boy from Madeira would make it to the stars. Except the boy from Madeira. </span><br><a href="/explore/tags/nike/">#nike</a><span> </span><a href="/explore/tags/soccer/">#soccer</a><span> </span><a href="/explore/tags/football/">#football</a><span> </span><a href="/explore/tags/cr7/">#CR7</a><span> </span><a href="/explore/tags/cristiano/">#Cristiano</a><span> </span><a href="/explore/tags/cristianoronaldo/">#CristianoRonaldo</a><span> </span><a href="/explore/tags/mercurial/">#Mercurial</a><span> </span><a href="/explore/tags/justdoit/">#justdoit</a></span></li>

我想尝试在span内获取文字。

2 个答案:

答案 0 :(得分:1)

您不能使用返回文本节点的XPath表达式,因为它是selenium的不可接受选项 - 选择器应仅返回WebDriver元素

另请注意,li的班级名称似乎是动态的,因此您可以改为使用子锚点的title属性值:

driver.find_element_by_xpath("//li[a[@title='nike']]/span").text

更新

完整的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get('https://www.instagram.com/nike/')

links = driver.find_elements_by_xpath('//a[contains(@href, "/?taken-by=nike")]')
for link in links:
    link.click()
    wait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//div/article")))
    print(driver.find_element_by_xpath("//li[a[@title='nike']]/span").text)
    driver.find_element_by_xpath("//div[@role='dialog']/button").click()

更新#2

您也可以在不打开每张图片的情况下轻松抓取相同的文字:

links = driver.find_elements_by_xpath('//img')
for img in links:
    print(img.get_attribute('alt'))

答案 1 :(得分:0)

我认为首先,如果您想要使用单个元素,则需要使用find_element_by_xpath()方法而不是find_elements_by_xpath()方法来获取元素。

如果您正在使用find_elements_by_xpath(),那么您需要使用循环语句来打印name变量中的所有名称。

此外,使用元素的.text属性可以获得所需的结果。

试试这个

   name = driver.find_element_by_xpath(//li[@class='_69ch8']/span).text
   print(name)