Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 23, 2015 11:07:46

Notan1310
Зарегистрирован: 2014-09-14
Сообщения: 98
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

Задача: Проверять обновление постов в однокласниках исключая промо посты.
Что я не могу: Я не могу понять как в блоке поста проверить присутвие элемента

.//*[@class='feed_label']
и если эта нода есть, то исключить ее из проверки.
Небольшая нароботки внизу. Инструменты Grab либо lxml
g.go('http://ok.ru/innovat',log_file='outtest2.html')
time.sleep(1)
for elem in g.doc.select(".//*[@class='feed']"):
    htmlPost = elem.html()
    
    #postValue = get_node_text(htmlPost.node(), ".//*[@class='feed_label']")
    #print postValue
 
    #if promoPost == 'DataNotFound':
    #    print 'Не рекламный пост'
    #else:
    #    print 'Рекламный пост '

Сейчас находит все посты.

Офлайн

#2 Янв. 24, 2015 01:27:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

Notan1310
g.doc.select(".//*[@class='feed']")
А где там класс feed?



Офлайн

#3 Янв. 24, 2015 10:48:17

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

>>> from lxml import etree
>>> q = etree.fromstring('<xml><hello>a</hello><x><hello>b</hello></x></xml>')
>>> q.findall('.//hello')  # XPath, recursive.
[<Element hello at 414a7c8>, <Element hello at 414a818>]



————————–
Истина где-то рядом

Отредактировано alexbadaloff (Янв. 24, 2015 10:48:31)

Офлайн

#4 Янв. 24, 2015 13:02:26

Notan1310
Зарегистрирован: 2014-09-14
Сообщения: 98
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

А где там класс feed?
py.user.next
А где там класс feed?
Если я правильно думаю я просто получаю список блоков(постов) и должен делать проверку на одно значение слово “Промо”. Если его нет то делаю выборку если есть то исключаю этот пост из списка. У меня не получается когда я уже по итераций начинаю работать с блоком еще внутри него проверять значения “Промо” есть или нет.
for elem in g.doc.select(".//*[@class='feed']"):
    htmlPost = elem.html()
Подскажите пожалуйста как можно провоерять значение используяю Итерацию. Ну например “Есть текст и в нем нужно проверить другой элемент, если есть то гууд” Не обязательно мою проблему буквально решать, для меня главное результат, я закодить не могу сообразить как такие задачи как с одами и примером выше.

Отредактировано Notan1310 (Янв. 24, 2015 13:08:03)

Офлайн

#5 Янв. 24, 2015 13:18:04

Notan1310
Зарегистрирован: 2014-09-14
Сообщения: 98
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

Еще по другому вопрос могу поставить. Как мне сделать htmlPost(нижний кодес) доступным для работы как с
g.doc.select('node').

for elem in g.doc.select(".//*[@class='feed']"):
    htmlPost = elem.html()

Офлайн

#6 Янв. 25, 2015 12:15:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

Notan1310
Подскажите пожалуйста как можно провоерять значение используяю Итерацию.
Вообще, если это lxml, то там есть логическое И. То есть внутри квадратных скобок ставишь and и второе выражение.

>>> import lxml.html
>>> 
>>> doc = lxml.html.fromstring(
...     '<a href="text1" class="text2">x</a>'
...     '<a href="text1" class="text3">y</a>'
... )
>>> 
>>> nodes = doc.xpath(r'//a[@href="text1" and @class="text2"]')
>>> 
>>> nodes
[<Element a at 0xb73ccdac>]
>>> nodes[0].attrib
{'class': 'text2', 'href': 'text1'}
>>>

Если же там что-то сложное и нужно обрабатывать в два этапа, то в lxml можно выполнять поиск в полученном узле.

>>> import lxml.html
>>> 
>>> doc = lxml.html.fromstring(
...     '<a href="text1" class="text2">x</a>'
...     '<a href="text1" class="text3">y</a>'
... )
>>> 
>>> nodes = doc.xpath(r'//a[@href="text1" and @class="text2"]')
>>> 
>>> for node in nodes:
...     lst = []
...     lst.extend(node.xpath(r'./text()'))
...     lst.extend(node.xpath(r'./@href'))
...     lst.extend(node.xpath(r'./@class'))
...     print(lst)
... 
['x', 'text1', 'text2']
>>>

Возможно, и в Grab'е так можно делать.


Notan1310
Если его нет то делаю выборку если есть то исключаю этот пост из списка.
Там ещё есть логическое НЕ. Тоже в квадратных скобках пишешь not перед выражением.


(У меня класса feed нет, потому что я не вхожу.)



Отредактировано py.user.next (Янв. 25, 2015 12:26:50)

Офлайн

#7 Янв. 25, 2015 22:08:56

Notan1310
Зарегистрирован: 2014-09-14
Сообщения: 98
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab или lxml проверка присутсвия элемента

py.user.next Спасибо. Задачу решил с вашей помощью

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version