python динамическое создание содержимого javascript

#python #selenium #web-scraping

#python #selenium #веб-очистка

Вопрос:

Я использую Python и Selenium для очистки веб-сайта. Что я делаю, так это перехожу на домашнюю страницу, вводю ключевое слово, например 1300746-79-5. На результирующей странице я пытаюсь очистить данные в разделе «цены». В частности, мне нужно получить информацию о «размере SKU-Pack» и «Цене (USD)». Но эта информация зашифрована в Javascript, поэтому я не вижу их в исходном коде. Мне интересно, как я могу этого добиться.

Я написал некоторый код, который приводит меня на интересующую страницу, но я все еще не вижу информацию javascript. Вот что у меня есть до сих пор.

 from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pprint

# Create a new instance of the Firefox driver
driver = webdriver.Chrome('C:UsersReiDesktopchromedriver.exe')
driver.get("http://www.sigmaaldrich.com/united-states.html")

print driver.title
inputElement = driver.find_element_by_name("Query")

# type in the search
inputElement.send_keys("1300746-79-5")
inputElement.submit()
  

Ответ №1:

Все, что вы сделали, выглядит правильным для меня.

Информация о «размере SKU-Pack» и «Цене (USD)» не «зашифровывается», а извлекается после нажатия JavaScript. действие. Все, что вам нужно сделать, это нажать на название продукта или ссылку с ценами.

 from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pprint

driver = webdriver.Chrome()
driver.get("http://www.sigmaaldrich.com/united-states.html")

print driver.title
inputElement = driver.find_element_by_name("Query")

# type in the search
inputElement.send_keys("1300746-79-5")
inputElement.submit()

pricing_link = driver.find_element_by_css_selector("li.priceValue a")
print pricing_link.text
pricing_link.click()

# then deal with the data you want
price_table = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, ".priceAvailContainer tbody"))
)
print 'price_table.text: '   price_table.text

driver.quit()
  

Комментарии:

1. Можете ли вы объяснить, что я должен делать после выполнения действия нажатия javascript? Я все еще не вижу информацию о артикуле и ценах в исходном коде… Я подумываю об использовании beautifulsoup для извлечения определенных элементов. Но мой код не возвращает URL-адрес продукта, поэтому я ничего не понимаю.

2. @user3788728: Хм. Похоже, что-то не так. Можете ли вы увидеть это в пользовательском интерфейсе (своими глазами)? Какие у вас версии Selenium, Chrome, ChromeDriver?

3. моя версия Chrome — 35.0.1916.153, ChromeDriver — 2.9. Я загрузил selenium сегодня утром, поэтому это должна быть самая последняя версия.

4. Я могу это увидеть, если выделю раздел и выберу элемент просмотра. Но если я просто перейду в исходный код страницы, они не отображаются

5. @user3788728: Здесь все работает нормально. Я опубликую полный код выше. У меня не возникает никаких проблем с получением данных. Источник страницы может иметь некоторые ограничения в отношении вызовов AJAX. Какие-либо конкретные причины, по которым вы заботитесь об источнике страницы в первую очередь?