#selenium #css-selectors #webdriver #java-stream #webdriverwait
#selenium #css-селекторы #веб-драйвер #java-поток #вебдрайвервейт
Вопрос:
Я учусь использовать selenium для извлечения данных с веб-страниц. Данные, которые я пытаюсь извлечь из страницы https://www.redfin.com/CA/Los-Angeles/1366-W-22nd-St-90007/home/6896268 это дата, например, 29 октября 2018 года. Все даты указаны в первом столбце html-таблицы «История недвижимости для 1366 West 22nd St».
Однако, используя следующий код, я могу получить только первые три даты из таблицы.
cell = driver.find_element(By.XPATH, '//table[@class="basic-table-2"]/tbody/tr[1]/td[1]')
Поскольку таблица свернута, мне нужно щелкнуть ссылку «Просмотреть всю историю свойств» в нижней части раздела, чтобы развернуть таблицу и просмотреть остальные даты в этой таблице. Можно ли в любом случае использовать selenium для получения всех дат из таблицы, включая даты в свернутых строках?
Ответ №1:
Вам нужно будет щелкнуть ссылку «Просмотреть все», прежде чем вы сможете получить эти даты. Их просто нет в DOM, пока список не будет расширен. Но щелкнуть легко:
driver.find_element(By.CLASS_NAME, 'bottomLink').click()
Ответ №2:
На веб-сайте, чтобы нажать на элемент с текстом, см. Всю историю свойств, чтобы развернуть таблицу и извлечь даты из таблицы, вам нужно вызвать WebDriverWait, а затем использовать Java8, stream()
и map()
вы можете использовать следующее решение:
- Блок кода:
driver.get("https://www.redfin.com/CA/Los-Angeles/1366-W-22nd-St-90007/home/6896268"); ((JavascriptExecutor)driver).executeScript("return arguments[0].scrollIntoView(true);", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("section#property-history-scroll h2.h2")))); new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("span.bottomLink"))).click(); List<String> myDates = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("section#property-history-scroll tbody tr.PropertyHistoryEventRow[id^='propertyHistory-']>td.date-col"))).stream().map(element->element.getAttribute("innerHTML")).collect(Collectors.toList()); System.out.println(myDates);
- Вывод на консоль:
[Oct 29, 2018, Aug 24, 2018, Aug 24, 2018, Jul 24, 2018, Mar 18, 2018, Dec 31, 2015, Sep 11, 2015, Jul 10, 2015, May 22, 2015, May 20, 1988, Aug 10, 1979]