Найти - Пользователи
Полная версия: Парсинг динамических элементов [Selenium]
Начало » Python для новичков » Парсинг динамических элементов [Selenium]
1
hdj
Нужно пропарсить страницу.
На картинке <div class=“view-content”> содержит подэлементы (типа div), которых может быть произвольное количество.
Доступ к этому “корневому” div'у получаю так:
objRootDiv = wd.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/div/div/div[1]/div/div/div")

Вопрос, каким образом организовать цикл для поэлементного перебора? В каждом div'е будут подэлементы для дальнейшего парсинга.


Картинка:



И второй вопрос: целесообразней искать элемент по xpath или class?
ajib6ept
Сперва по xpath заходим на
div[@class="view-content"]
потом через find_elements_by_xpath перебираем все div'ы

вот пример, получаем все элементы меню

#coding: utf-8
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path='C:\\bin\\phantomjs\\phantomjs.exe')
driver.get('https://www.python.org/')
menu = driver.find_element_by_xpath('//ul[@class="menu"][@role="tree"]')
for k in menu.find_elements_by_xpath('./li'):
    print k.text
hdj
Благодарю!

Еще вопрос.


Если обратиться к свойству Text выделенного элемента span, допустим:
wd.find_element_by_xpath('.//span[@class="expired time"]').text
или
print (wd.find_element_by_xpath('//div[@class="view-content"]').find_element_by_xpath('.//span[@class="expired time"]').text)
то получим значение:
12:20
170 р.

Как получить только "12:20"? Без текстовых значений других вложенных элементов.
hdj
hdj
Как получить только “12:20”? Без текстовых значений других вложенных элементов.
Нашел вариант: считывать до символа перевода строки. Для данного случая это подходит, но не факт, что будет применимо для других.

Хотелось бы узнать, есть ли другие решения.
hdj
А как обратиться к подэлементу <div class=“views-row views-row-3 views-row-odd row”> кроме как?
div[@class="view-content"]/div[3]

Поиск по
div[@class="views-row"]
выдает ошибку.



<div class="view-content">
	<div class="views-row views-row-1 views-row-odd views-row-first row">
	<div class="views-row views-row-2 views-row-even row">
	<div class="views-row views-row-3 views-row-odd row">
	<div class="views-row views-row-4 views-row-even row">
ajib6ept
Так надо полное имя класса писать

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://krasnoyarsk.kinomechta.com/')
print  driver.find_element_by_xpath('//div[@class="view-content"]/div[3]') == driver.find_element_by_xpath('//div[@class="view-content"]/div[@class="views-row views-row-3 views-row-odd row"]')
hdj
Допустим надо собрать все подэлементы

<div class="view-content">
	<div class="views-row views-row-1 views-row-odd views-row-first row">
	<div class="views-row views-row-2 views-row-even row">
	<div class="views-row views-row-3 views-row-odd row">
	<div class="views-row views-row-4 views-row-even row">

Приходится использовать такой код:
divMain = driver.find_element_by_xpath('.//div[@class="view-content"]')
print ('divMain:')
print (divMain)
divSubs = divMain.find_elements_by_xpath('./div')
print ('divSubs:')
print (divSubs)

Если б можно было указать не полное имя класса, а одно из имен (например, views-row), то можно было б сделать это короче)
ajib6ept
а если так попробовать

driver.find_elements_by_xpath('//div[@class="view-content"]/div[contains(@class, "views-row")]')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB