import lxml.html as LH
content = '''\
<div id="all-stories" class="book">
<ul>
<li title="Book1" ><a href="book1_url">Book1</a></li>
<li title="Book2" ><a href="book2_url">Book2</a></li>
</ul>
</div>
'''
root = LH.fromstring(content)
for atag in root.xpath('//div[@id="all-stories"]//li/a'):
print(atag.attrib['href'], atag.text_content())
plony
('book1_url', 'Book1')
('book2_url', 'Book2')
XPath //div[@id="all-stories"]/div
nie pasuje do niczego, ponieważ nie ma dziecko div
wewnątrz zewnętrznego znacznika div
.
XPath //div[@id="all-stories"]/li
też nie pasuje, bo nie ma bezpośredni dziecko li
Tage wewnątrz znacznika div
. Jednak //div[@id="all-stories"]//li
powoduje, że pasuje do znaczników li
, ponieważ //
mówi XPath, aby rekurencyjnie przeszukało tak głęboko, jak to konieczne, aby znaleźć znaczniki li
.
Zawartość, której szukasz, nie znajduje się w tagu li
. Jest wewnątrz tagu a
. Zamiast tego użyj XPath '//div[@id="all-stories"]//li/a'
, aby dotrzeć do tagów a
. Wartość atrybutu href
jest dostępna pod numerem atag.attrib['href']
, a tekst z atag.text_content()
.
Nie chcesz "// div [@ id =" all-stories "]/ul/li/text()'? – kgraney
@ kgraney Próbowałem podejścia, ale nie przyniosłem mi wyniku. –