使用Python XPath获取AASTOCKS网页P/B Ratio值遇IndexError求助
Hey there! Let's break down why your code is hitting that error and how to get the P/B Ratio value successfully.
The Root Cause
Your current code uses requests.get() to fetch the page, which only retrieves the static initial HTML sent by the server. The P/B Ratio on AAStocks is likely loaded dynamically with JavaScript—meaning the data isn't present in the initial page content. That's why your XPath query returns an empty list, and trying to access value[0] throws the IndexError.
Solution 1: Use Selenium to Simulate a Browser
Selenium mimics a real web browser, so it waits for JavaScript to load all dynamic content before you extract data. Here's how to adjust your code:
First, install Selenium and the ChromeDriver (or your preferred browser's driver):
pip install selenium
Then update your code:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC URL = 'http://www.aastocks.com/en/stocks/quote/detail-quote.aspx?symbol=00371' def get_pb_ratio(): # Initialize Chrome driver (make sure ChromeDriver is in your PATH) driver = webdriver.Chrome() try: driver.get(URL) # Wait up to 10 seconds for the P/B Ratio element to load pb_container = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'tbPBRatio')) ) # Extract the value from the second div inside the container pb_value = pb_container.find_element(By.XPATH, './div[2]').text print(f'P/B Ratio: {pb_value}') return pb_value finally: # Always close the browser when done driver.quit() if __name__ == "__main__": get_pb_ratio()
Solution 2: Call the Site's API Directly (Faster & More Efficient)
Instead of loading the entire page, you can find the API endpoint that AAStocks uses to fetch the P/B Ratio data. Here's how to do it:
- Open your browser's DevTools (F12)
- Go to the Network tab
- Refresh the AAStocks page
- Look for XHR/fetch requests that return financial data (filter by "XHR" to narrow it down)
Once you find the right API endpoint, you can request it directly with requests. Here's an example (adjust the URL based on what you find in DevTools):
import requests # Replace this with the actual API endpoint you find in DevTools API_URL = 'http://www.aastocks.com/en/api/financial/getStockQuote?symbol=00371' def get_pb_ratio_via_api(): # Add headers to mimic a real browser request headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } response = requests.get(API_URL, headers=headers) data = response.json() # Extract P/B Ratio from the JSON response (adjust the path based on actual data structure) pb_ratio = data.get('Quote', {}).get('PBRatio') print(f'P/B Ratio: {pb_ratio}') return pb_ratio if __name__ == "__main__": get_pb_ratio_via_api()
This method is faster because it skips loading the entire page and just fetches the raw data you need.
内容的提问来源于stack exchange,提问作者io inspirio

