Результаты Find_by_xpath с ошибками - PullRequest
0 голосов
/ 05 июля 2019

Я Барт, я новичок в Python, и это мой первый пост здесь. Как фанат виски, я хотел почистить некоторые магазины, чтобы предложить мне последние предложения по виски, однако я застрял на странице Асды. Я просмотрел здесь целую вечность, но без какой-либо удачи, следовательно, мой пост.

Спасибо.

Браузер открывается и закрывается, как и ожидалось.

ниже мое творение:

Import libraries
# import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
# import pandas as pd
# import requests
from selenium.webdriver.firefox.options import Options as FirefoxOptions

# specify url
#url = "https://groceries.asda.com/product/whisky/glenmorangie-the-original-single-malt-scotch-whisky/68303869"
url = "https://groceries.asda.com/search/whisky/1/relevance-desc/so-false/Type%3A3612046177%3AMalt%20Whisky"

# run webdriver with headless option
options = FirefoxOptions()
driver = webdriver.Firefox(options=options)
options.add_argument('--headless')
# get page
driver.get(url)
# execute script to scroll down the page
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;')
# sleep for 30s
time.sleep(30)
# close driver
driver.close()

# find element by xpath
results = driver.find_elements_by_xpath("//*[@id='componentsContainer']//*[@id='listingsContainer']//*[@class='product active']//*[@class='title productTitle']")
"""soup = BeautifulSoup(browser.page_source, 'html.parser')"""

print('Number of results', len(results))

Вот вывод.

Traceback (most recent call last):
  File "D:/PycharmProjects/Giraffe/asda.py", line 29, in <module>
    results = driver.find_elements_by_xpath("//*[@id='componentsContainer']//*[@id='listingsContainer']//*[@class='product active']//*[@class='title productTitle']")
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 410, in find_elements_by_xpath
    return self.find_elements(by=By.XPATH, value=xpath)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1007, in find_elements
    'value': value})['value'] or []
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSessionIdException: Message: Tried to run command without establishing a connection


Process finished with exit code 1

1 Ответ

0 голосов
/ 05 июля 2019

Возможно, это не идеальное решение.Я просто пытался придерживаться того, что вы уже написали.Я знаю, что жестко запрограммированная задержка - это тоже не лучший способ.Тем не менее, вот как вы можете получить результат:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

url = "https://groceries.asda.com/search/whisky"

driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)

driver.get(url)
actions = ActionChains(driver)
for _ in range(3):
    actions.send_keys(Keys.END).perform()
    time.sleep(3)

results = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//*[@id='searchContainer']//*[contains(@class,'productListing')]//*[contains(@class,'productTitle')]/a")))
print('Number of results', len(results))
driver.quit()

Вывод:

Number of results 56
...