我想在此站点上提取产品名称:https://shopee.com.my/search?keyword=h370m 在这个问题Selenium can not scrape Shopee e-commerce site using python上,我已经获得@DebanjanB的支持,但是我无法将产品名称的xpath应用于该解决方案。 这是我的代码:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('start-maximized')
options.add_argument('disable-infobars')
options.add_argument('--disable-extensions')
browserdriver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Users\\admin\\Desktop\\chromedriver_win32\\Chromedriver')
browserdriver.get('https://shopee.com.my/search?keyword=h370m')
WebDriverWait(browserdriver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='shopee-modal__container']//button[text()='English']"))).click()
print([my_element.text for my_element in WebDriverWait(browserdriver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, ".//*[@class='_1JAmkB']")))])
print("Program Ended")
此外,我尝试了其他xpath,例如:
By.XPATH, ".//*[@class='_1JAmkB']/child::div"
或
//div[contains(concat(' ', normalize-space(@class), ' '), ' _1NoI8_ ')]
他们俩都不能给我预期的结果
我收到的输出只是:
['', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] Program Ended
请帮助我解决此问题。谢谢!
答案 0 :(得分:2)
XPath:
您可以使用此xpath,并且还需要innerHTML(不是.text)
//*[@class="_1NoI8_ _2gr36I"]
然后提取innerHTML。
print([my_element.get_attribute('innerHTML') for my_element in WebDriverWait(browserdriver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@class="_1NoI8_ _2gr36I"]')))])
CSS:
print([my_element.get_attribute('innerHTML') for my_element in WebDriverWait(browserdriver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "._1NoI8_._2gr36I")))])
API:
我仍然认为API更好。我展示了使用该here。我每次都会获得名称和价格,因此不确定随着时间的推移会出现什么问题(尽管我不知道您已经运行了多少次)。使用API,您无需滚动即可生成所有结果。
稍等片刻,您还可以从页面上的脚本标签提取所有数据:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
import json
browserdriver = webdriver.Chrome()
browserdriver.get('https://shopee.com.my/search?keyword=h370m')
WebDriverWait(browserdriver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='shopee-modal__container']//button[text()='English']"))).click()
time.sleep(2)
products = [item for item in WebDriverWait(browserdriver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '[type="application/ld+json"]')))]
products_json = [product.get_attribute('innerHTML') for product in products[1:]]
names = [json.loads(product)['name'] for product in products_json] #just showing name extraction from json
len(names)