Как разобрать динамический элемент dom?

Хочу сделать парсер для парсинга цены, но не могу найти рабочий метод парсинга innerHTML

Я не знаю почему, но селен (getAttribute(innerHTML)), фантомные js (функция page.evaluation(){return document.ElementToParse.innerHTML}) и scrapy-splash (загрузил веб-страницу с помощью WebPageEngine и проанализировал html) не работай. Все время результат пустой "[]", null или веб-элемент

Я тестирую свой код на продуктах Banggood, а также на целевой странице, но результат всегда один и тот же.

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

driver = webdriver.Firefox()
driver.get("https://www.banggood.com/BlitzWolf-Ampcore-Turbo-TC10-3A-Durable-USB-Type-C-Charging-Data-Cable-p-1188424.html?rmmds=category&cur_warehouse=CN") #random url
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "item_now_price"))
    )
finally:
    driver.quit()
print(element)

и вывод:

<selenium.webdriver.firefox.webelement.FirefoxWebElement (session = "b0593791-138b-4177-a8f3-e7983143824a", element = "d08f4717-d3f1-4594-8f2b-1bf943deb9f9")>

когда нужно что-то вроде:

6.59(or US$6.59)

я тоже пробовал

price = driver.find_element_by_class_name('item_now_price').getAttribute("innerHTML")

а также

var page = require('webpage').create();

page.open('https://www.banggood.com/BlitzWolf-Ampcore-Turbo-TC10-3A-        Durable-USB-Type-C-Charging-Data-Cable-p-1188424.html?rmmds=category&cur_warehouse=CN', function(status) {

    var price = page.evaluate(function() {
        return document.getElementByClassName('item_now_price').innerHTML;
        });
console.info('price is ' + price);
phantom.exit();
});

но результат нулевой и когда я добавляю

page.includeJs(/url/to/js)

терминал перестает работать

с

Добро пожаловать в Стек! Если бы вы могли предоставить более конкретную информацию о вашей проблеме, а не общие сведения, это было бы полезно. Например, предоставьте конкретному элементу его html-код, на котором вы пробовали это, и пример кода того, что вы пробовали, результат, который вы ожидали, и результат, который вы получили вместо этого.

mrfreester 13.05.2019 17:58

Извините, я забыл вставить код

Mark 13.05.2019 18:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
316
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как только вы получите элемент в селене, вы можете получить текст этого элемента с помощью .text

См. небольшую корректировку вашего первого примера ниже:

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "item_now_price"))
    )
    print(element.text)
finally:

Посмотрите, даст ли это результаты, которые вы ищете.

а можно я задам тебе вопрос?

Mark 13.05.2019 19:39

Вы знаете какой-нибудь более быстрый вариант парсера?

Mark 13.05.2019 19:43

просто если я, например, разберу 10 тысяч элементов, то только открытие и закрытие браузера будет занимать много времени

Mark 13.05.2019 19:51

Если у вас есть доступ к какому-либо API, чтобы вы могли избежать пользовательского интерфейса, это путь... Если нет, вы также можете попробовать безголовый браузер с селеном, чтобы ускорить работу, и попробовать работать параллельно. Это вещи, которые вы можете исследовать отдельно, поскольку комментарии — не лучшее место для решения этой проблемы. Надеюсь, это направит вас на правильный путь. Удачи!

mrfreester 13.05.2019 19:53

Еще раз спасибо, вы мне очень помогли. Желаю тебе всего наилучшего :)

Mark 13.05.2019 20:02
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.banggood.com/BlitzWolf-Ampcore-Turbo-TC10-3A-Durable-USB-Type-C-Charging-Data-Cable-p-1188424.html?rmmds=category&cur_warehouse=CN") #random url
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "item_now_price"))
    ).text
finally:
    driver.quit()
print(element)

Другие вопросы по теме