2013-06-29 12 views
7

Mam html jak tenlista aby elementy wewnątrz znacznika div przy użyciu XPath

<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> 

chcę uzyskać książek i ich odpowiednich URL za pomocą XPath, ale wydaje się moje podejście nie działa. dla uproszczenia próbowałem wyodrębnić wszystkie elementy w „Li” tagów następująco

lis = tree.xpath('//div[@id="all-stories"]/div/text()') 
+0

Nie chcesz "// div [@ id =" all-stories "]/ul/li/text()'? – kgraney

+0

@ kgraney Próbowałem podejścia, ale nie przyniosłem mi wyniku. –

Odpowiedz

9
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"]//lipowoduje, ż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().

Powiązane problemy