如何为selenium找到合适的xpath?

2024-05-13 21:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图刮去这一页: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问题后,我在开头添加了部分[@class....],但我遗漏了一些东西。如果你知道如何帮助,谢谢你


Tags: texthttpsimportdivcomappwwwdriver
3条回答

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

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']

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

看起来像这样的东西:

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

试试看

完整路径不是最好的路径,也更难阅读。XPath是“过滤器”,请尝试查找所需控件的一些唯一属性,或父控件的一些唯一描述。看,所需的跨度有“value”类,它位于带有“tooltipWrapper”类的跨度内,父跨度还有另一个子跨度,带有“key”类和“openinterest”文本。有数千个定位器,我可以找到两个:

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

相关问题 更多 >