Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 4, 2014 18:15:49

hdj
Зарегистрирован: 2014-11-19
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

Нужно пропарсить страницу.
На картинке <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?

Отредактировано hdj (Дек. 4, 2014 18:27:17)

Прикреплённый файлы:
attachment динам элем.png (15,6 KБ)

Офлайн

#2 Дек. 4, 2014 20:11:05

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

Сперва по 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



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Отредактировано ajib6ept (Дек. 4, 2014 20:11:21)

Офлайн

#3 Дек. 5, 2014 13:28:10

hdj
Зарегистрирован: 2014-11-19
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

Благодарю!

Еще вопрос.


Если обратиться к свойству 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 (Дек. 6, 2014 09:52:25)

Прикреплённый файлы:
attachment к2_спан.png (11,2 KБ)

Офлайн

#4 Дек. 6, 2014 13:13:40

hdj
Зарегистрирован: 2014-11-19
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

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

Хотелось бы узнать, есть ли другие решения.

Офлайн

#5 Дек. 9, 2014 08:54:56

hdj
Зарегистрирован: 2014-11-19
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

А как обратиться к подэлементу <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">

Отредактировано hdj (Дек. 9, 2014 09:01:12)

Офлайн

#6 Дек. 9, 2014 19:45:32

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

Так надо полное имя класса писать

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"]')



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#7 Дек. 10, 2014 09:42:32

hdj
Зарегистрирован: 2014-11-19
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

Допустим надо собрать все подэлементы

<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), то можно было б сделать это короче)

Отредактировано hdj (Дек. 10, 2014 09:43:32)

Офлайн

#8 Дек. 10, 2014 11:55:15

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Парсинг динамических элементов [Selenium]

а если так попробовать

driver.find_elements_by_xpath('//div[@class="view-content"]/div[contains(@class, "views-row")]')



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version