Получить рабочий относительный путь к названию продукта на коммерческом сайте Shopee - PullRequest
2 голосов
/ 26 апреля 2019

Я хочу получить название продукта на этом сайте: https://shopee.com.my/search?keyword=h370m Я получил поддержку @DebanjanB по этому вопросу Selenium не может очистить сайт электронной торговли Shopee, используя python , но яЯ не могу применить 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

Пожалуйста, помогите мне решить эту проблему.Спасибо!

1 Ответ

2 голосов
/ 26 апреля 2019

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 лучше. Я показал, используя здесь . Я получаю названия и цены каждый раз, так что неуверен в том, что проблема со временем у вас возникла (хотя я не знаю, сколько раз вы ее запускали). С 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)
...