Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2011 01:47:38

couatl
От:
Зарегистрирован: 2011-10-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование cssselect с заданием значения нужного атрибута

Имеется html-страница с примерно такой разметкой

<html>
<body>
<div class="content_block" id="content_1" style="display: block; ">
<ol>
<li>
<a href="/..." title="AAA">aa</a>
</li>
<li>
<a href="/..." title="BBB">bb</a>
</li>
<li>
<a href="/..." title="CCC">cc</a>
</li>
</ol>
</div>
<div class="content_block" id="content_2" style="display: block; ">
<ol>
<li>
<a href="/..." title="AAA2">aa2</a>
</li>
<li>
<a href="/..." title="BBB2">bb2</a>
</li>
<li>
<a href="/..." title="CCC2">cc2</a>
</li>
</ol>
</div>
</body>
</html>
Нужно выдернуть имена ссылок только из первого div'a.

for one in cleaned_html.cssselect( 'div ol li a' )
print one.text_content()
выдает
aa
bb
cc
aa2
bb2
cc2
то есть пихает и из второго div'a

Пробовал
for one in cleaned_html.cssselect( 'div#content_1.content_block ol li a' )
print one.text_content()
но не получилось.



Отредактировано (Ноя. 2, 2011 01:48:16)

Офлайн

#2 Ноя. 2, 2011 02:08:30

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Использование cssselect с заданием значения нужного атрибута

from lxml import etree

HTML = """<html>
<body>
<div class="content_block" id="content_1" style="display: block; ">
<ol>
<li>
<a href="/..." title="AAA">aa</a>
</li>
<li>
<a href="/..." title="BBB">bb</a>
</li>
<li>
<a href="/..." title="CCC">cc</a>
</li>
</ol>
</div>
<div class="content_block" id="content_2" style="display: block; ">
<ol>
<li>
<a href="/..." title="AAA2">aa2</a>
</li>
<li>
<a href="/..." title="BBB2">bb2</a>
</li>
<li>
<a href="/..." title="CCC2">cc2</a>
</li>
</ol>
</div>
</body>
<html>
"""

if "__main__" == __name__:
parser = etree.HTMLParser(remove_blank_text=True, strip_cdata=False)
html = etree.fromstring(HTML, parser)

# вариант 1
for node in html.find(".//div").iterfind(".//a"):
print(node.text)
# вариант 2
for node in html.iterfind(".//div[@id='content_1']/*//a"):
print(node.text)



Офлайн

#3 Ноя. 2, 2011 16:27:37

jcrow
От:
Зарегистрирован: 2011-10-31
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование cssselect с заданием значения нужного атрибута

couatl
но не получилось.
Что именно не получилось? У меня вариант с
for one in cleaned_html.cssselect( 'div#content_1.content_block ol li a' )
print one.text_content()
работает.




Подпись - это небольшая приписка (хи-хи).

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version