Skip to content
Advertisement

How would I get all elements with a specific XPATH, get the lowest price among them, then get the title of it? [Using Selenium]

I’m working on something to scrape all element texts, somehow sort the number and get the title in it. I’ve gotten to the point where I can print all element texts but I can’t seem to get the lowest number and title. I’m also only trying to get the elements that are “CARdano4SPEED__”, and the number should only be 1-1000, if it isn’t in that range, it shouldn’t print. It should also only just get the lowest one of that. I’m not really sure how to go about that so any advice would be helpful, thanks!

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.jpg.store/collection/cardano4speed?filters=%257B%2522engine%2522%253A%255B%2522v8%2520special%2520edition%2522%255D%257D")

elements = driver.find_elements(By.XPATH, '//*[@id="asset-card"]')
for element in elements:
  print(element.text)

Which outputs:

CARdano4SPEED1120
1000
For Sale
CARdano4SPEED118
1111
For Sale
CARdano4SPEED117
5000
For Sale

Advertisement

Answer

You should use dot . to create relative xpath and get title, price in every element separatelly.

Later you can get title, remove "CARdano4SPEED" and convert rest into int(). And now you can check if it in range 1-1000 and display or not.

And if you put it on list with price (converted to int()) as first then you can use min() to get element with lower price.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.jpg.store/collection/cardano4speed?filters=%257B%2522engine%2522%253A%255B%2522v8%2520special%2520edition%2522%255D%257D")

data = []

elements = driver.find_elements(By.XPATH, '//*[@id="asset-card"]')
for element in elements:
    title = element.find_element(By.XPATH, './/h4').text
    price = element.find_element(By.XPATH, './/span[@id="asset-price"]').text
    prince = int(price)
    number = int(title.replace("CARdano4SPEED", ""))

    if number <= 1000:
        print('title:', title)
        print('price:', price)
        print('number:', number)
        print('---')

        data.append( [price, number, title] )
    
# ---

price, number, title = min(data)
print('min:', price, number, title)

Result:

title: CARdano4SPEED118
price: 1111
number: 118
---
title: CARdano4SPEED117
price: 5000
number: 117
---
min: 1111 118 CARdano4SPEED118
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement