Веб-драйвер Selenium PhantomJS не может захватить содержимое ajax

Я пытаюсь очистить страницу, которая загружает большую часть своего содержимого через ajax.

Я пытаюсь получить все узлы li с атрибутом data-section с этой веб-страницы. , Например. HTML-код ответа содержит шесть обязательных узлов, которые мне нужны, но большинство остальных загружаются через запрос ajax, который возвращает html, содержащий оставшиеся li узла.

Поэтому я переключился с использования запросов на использование селена с драйвером PhantomJS, который должен быть дружественным к xhr, но я не получаю дополнительный загруженный контент ajax.

Запускаемый:

from selenium import webdriver
from lxml import html

br = webdriver.PhantomJS()
br.get(url)
tree = html.fromstring(br.page_source)
print tree.xpath('//li[@data-section]/a/text()')

Вкратце, приведенный выше код не может внедрить html на веб-страницу через xhr. Как я могу это сделать? Если нет, то каковы мои другие безголовые варианты.


person pad    schedule 15.11.2014    source источник
comment
возможный дубликат Ожидание полной загрузки таблицы использование селена с питоном   -  person Artjom B.    schedule 15.11.2014
comment
@ArtjomB. спасибо, хотя в этом вопросе есть уникальная таблица, которую может проверить ожидаемое условие, здесь, кажется, загружается произвольное количество идентичных li элементов. Не подскажете, как это проверить? Решение EC звучит лучше, чем неявное ожидание, которое замедлит сканирование.   -  person pad    schedule 15.11.2014
comment
@ArtjomB. только что отредактировал это в моем предыдущем комментарии. Я собираюсь просмотреть десятки тысяч страниц, и неявное ожидание звучит не очень привлекательно. Сеть нестабильна, поэтому мне придется установить критическое значение для неявного ожидания для учета медленных периодов, что также затянет сканирование при хорошей сети.   -  person pad    schedule 15.11.2014


Ответы (1)


На связанной странице заметно отображается индикатор загрузки (.archive_loading_bar), который исчезает, как только данные загружаются. Вы можете использовать явное ожидание с ожидаемым условием invisibility_of_element_located.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from lxml import html

driver = webdriver.PhantomJS()
driver.get(url)
wait = WebDriverWait(driver, 10)
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, '.archive_loading_bar')))
tree = html.fromstring(driver.page_source)

Это адаптировано из этого ответа и ожидает до 10 секунд или до загрузки данных.

person Artjom B.    schedule 15.11.2014
comment
Большое спасибо. Для всех будущих зрителей: driver в строке 6 следует заменить на br, а аргументы внутри invisibility_of_element_located должны быть кортежем (принимает только один аргумент), поэтому необходимо добавить дополнительную пару квадратных скобок. - person pad; 17.11.2014