Найти - Пользователи
Полная версия: Grab или lxml проверка присутсвия элемента
Начало » Python для новичков » Grab или lxml проверка присутсвия элемента
1
Notan1310
Задача: Проверять обновление постов в однокласниках исключая промо посты.
Что я не могу: Я не могу понять как в блоке поста проверить присутвие элемента
.//*[@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 'Рекламный пост '

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