【问题标题】:how to find proper xpath for selenium?如何为硒找到合适的 xpath?
【发布时间】:2020-07-01 00:48:24
【问题描述】:

我正在尝试抓取此页面:https://www.bitmex.com/app/trade/XBTUSD 获取页面左侧的未平仓合约数据。我在这个阶段

import bs4
from bs4 import BeautifulSoup
import requests
import re
from selenium import webdriver
import urllib.request

r = requests.get('https://www.bitmex.com/app/trade/XBTUSD')
url = "https://www.bitmex.com/app/trade/XBTUSD"
page = urllib.request.urlopen('https://www.bitmex.com/app/trade/XBTUSD')
soup = bs4.BeautifulSoup(r.text, 'xml')
resultat = soup.find_all(text=re.compile("Open Interest"))


driver = webdriver.Firefox(executable_path='C:\\Users\\Samy\\Desktop\\geckodriver\\geckodriver.exe')
results = driver.find_elements_by_xpath("//*[@class='contractStats hoverContainer block']//*[@class='value']/html/body/div[1]/div/span/div[1]/div/div[2]/li/ul/div/div/div[2]/div[4]/span[2]/span/span[1]")
print(len(results))

结果我得到 0。我为results 变量(也是driver.find_elements_by_xpath("//span[@class='price']/text()")尝试了几种不同的方法,但似乎找不到方法。我知道问题出在我复制 XML 路径时,但尽管阅读了Why does this xpath fail using lxml in python?https://stackoverflow.com/a/43095252/7937578,但似乎无法清楚地理解问题所在

我只使用通过复制获得的 XML 路径,但在阅读了这些 SO 问题后,我在 begining[@class....] 添加了部分,但我遗漏了一些东西。如果您知道如何提供帮助,谢谢!

【问题讨论】:

    标签: python selenium web-scraping


    【解决方案1】:

    如果我正确理解了您的要求,以下脚本应该会从该页面获取您所需的内容:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    link = "https://www.bitmex.com/app/trade/XBTUSD"
    
    with webdriver.Firefox() as driver:
        driver.get(link)
        wait = WebDriverWait(driver,10)
        items = [item.text for item in wait.until(EC.presence_of_all_elements_located((By.XPATH,"//*[@class='lineItem']/span[@class='hoverHidden'][.//*[contains(.,'Open Interest')]]//span[@class='key' or @class='value']")))]
        print(items)
    

    此时的输出:

    ['Open Interest', '640,089,423 USD']
    

    【讨论】:

    • 谢谢@asmitu!当我运行您的代码时,它工作正常,但打印的结果是['Open Interest', '654\u202f715\u202f936 USD']。但除了这个显示问题之外,我注意到你使用的代码结构与我尝试的不同,你能解释一下你做了什么吗?或者分享一个链接到你学习它的地方?非常感谢!
    • A good place 开始。
    【解决方案2】:

    我不知道为什么会失败,但我认为查找任何元素的最佳方法是使用完整的 XPath。

    看起来像这样的东西:

    homebutton = driver.find_element_by_xpath("/html/body/header/div/div[1]/a[2]/span")
    

    试一试。

    【讨论】:

      【解决方案3】:

      完整路径不是最好的,也更难阅读。 XPath 是“过滤器”,尝试为需要的控件找到一些独特的属性,或者对父项进行一些独特的描述。看,需要的 span 有“value”类,它位于带有“tooltipWrapper”类的 span 内,父 span 还有另一个带有“key”类和“Open Interest”文本的子类。有数千个定位器,我可以确定两个:

      //span[@class = 'tooltipWrapper' and span[string() = 'Open Interest']]//span[@class = 'value']
      //span[@class = 'key' and text() = 'Open Interest']/..//span[@class = 'value']
      

      【讨论】:

      • 感谢您的回答,我在结果变量中尝试了您的两个建议,但对我都不起作用
      • 我都检查过了,它们都是有效的。请注意,此控件有时会被隐藏,它会被另一个控件替换。
      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多