Следующий код селена содержит ошибку xpath, но он дает синтаксическую ошибку и ничего не выводит, можно ли ее устранить? - PullRequest
0 голосов
/ 29 марта 2019

Непрерывная синтаксическая ошибка и отсутствие вывода в моей веб-программе очистки. Мой xpath правильный, так как он указывает на правильные имена, но я не получаю никакого вывода. Веб-сайт https://www.ikea.com/sa/en/search/?query=chair&pageNumber=1. Может кто-нибудь помочь?

У меня есть Python 3.4.4, и я использую код Visual Studio в качестве графического интерфейса. Я пытаюсь получить названия предметов с веб-сайта ИКЕА в виде веб-кода. Но у меня постоянно есть ошибка. Может кто-нибудь помочь?

import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException, WebDriverException
import csv
import os

driver= webdriver.Chrome("C:/Python34/Scripts/chromedriver.exe")
driver.get("https://www.ikea.com/sa/en/search/?query=chair&pageNumber=1")
title =driver.findElement(By.XPath("//span[@class='prodName prodNameTro']")).text()
print(title) 

Ожидаемый результат:

RENBERGET
HÄRÖ / FEJAN
ÄPPLARÖ
TÄRENDÖ / ADDE
AGAM
ÄPPLARÖ

Это названия предметов на странице

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Для очистки страницы с помощью Python вам не нужен Selenium.Гораздо быстрее и проще использовать, например, и Вот базовый пример кода для поиска стульев на ikea , вы получите все стулья (723) со всех страниц за секунды:

import requests
from bs4 import BeautifulSoup

# array of all items
result = []

# request first page of query. "query=chair&pageNumber=1"
response = requests.get('https://www.ikea.com/sa/en/search/?query=chair&pageNumber=1')
# assert for response is OK
assert response.ok

# parse response test using html.parser
page = BeautifulSoup(response.text, "html.parser")

# get last page number and convert to integer.
last_page_number = int(page.select_one(".pagination a:last-child").text)

# iterate throw from 1 to 30 pages
for i in range(1, last_page_number + 1):
    # if i==1 skip request again, because we already get response for the first page
    if i > 1:
        # request using i as parameter
        response = requests.get(f'https://www.ikea.com/sa/en/search/?query=chair&pageNumber={str(i)}')
        assert response.ok
        page = BeautifulSoup(response.text, "html.parser")

    # get all products containers, that contains name, price and description
    products = page.select("#productsTable .parentContainer")

    # iterate throw all products in the page. get name, price and description and add to result as map
    for product in products:
        name = product.select_one(".prodName").text.strip()
        desc = product.select_one(".prodDesc").text.strip()
        price = product.select_one(".prodPrice,.prodNlpTroPrice").text.strip()
        result.append({"name": name, "desc": desc, "price": price})

# print results, you can do anything..
for r in result:
    print(f"name: {r['name']}, price: {r['price']}, description: {r['desc']}")

print("the end")
0 голосов
/ 29 марта 2019

Поскольку на странице присутствует несколько продуктов, вы можете сохранить все значения в списке и затем распечатать эти значения.
Вы можете выполнить это следующим образом:

driver= webdriver.Chrome("C:/Python34/Scripts/chromedriver.exe")
driver.get("https://www.ikea.com/sa/en/search/?query=chair&pageNumber=1")
productNames = driver.find_elements_by_xpath("//span[contains(@id,'txtNameProduct')]")
for product in productNames:
    print (product.text)
...