【问题标题】:Get text using selenium PhantomJS inside Span在 Span 中使用 selenium PhantomJS 获取文本
【发布时间】:2017-06-05 04:52:52
【问题描述】:

我尝试使用 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 中获取文本。

【问题讨论】:

  • 能否提供HTML
  • 这是 HTML,彼得:
  • nike没有人相信一个来自马德拉岛的男孩会登上星星。除了来自马德拉岛的男孩。
  • 您能否使用HTML 代码更新您的问题(使用“编辑”按钮)。 cmets 中提供的示例似乎并不完整。还要指定您想要获得的所需输出
  • @StefaniJohnsson 您可以考虑分享相关的网址和您尝试执行的手动步骤吗?谢谢
  • @Andersson 我在问题中添加 HTML
  • 标签: python selenium selenium-webdriver phantomjs


    【解决方案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'))
    

    【讨论】:

    • 对我来说仍然是错误的。我会给你条件我的代码。
    • 可能有几个原因...您能分享页面URL 并说明您打算在该页面上具体做什么吗?
    • 我尝试使用 seleniung 从 Instagram 测试 javascript,我尝试使用 nike 帐户。 instagram.com/nike。我尝试的是,点击该图片后的图片将显示图片和图片标题,我想获取图片标题。
    • 检查更新的答案。请注意,这将仅从当前可见的文章中返回文本。要获得更多信息,您应该向下滚动页面(使用Keys.END)以触发XHR
    • 对不起,我需要使用 PhantomJS 的 webdriver。不是 Chrome 或 Firefox。我尝试不在 selenium 上打开浏览器。 @andersson
    【解决方案2】:

    我认为首先,如果你想去单个元素,你需要使用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)
    

    【讨论】:

    • 你确定 /li[@class='_69ch8']/span 不是字符串吗?
    • 我给 /li[@class='_69ch8']/span 刺痛,但仍然出错。 ' name = driver.find_element_by_xpath("//li[@class='_99ch8']/span").text '
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签