2013-06-29 5 views
7

У меня есть HTML, как этотсписок прибудет элементы внутри сНа тега с помощью 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> 

Я хочу, чтобы получить книги и их соответствующие URL с помощью XPath, но мне кажется, что мой подход не работает. для простоты я попытался извлечь все элементы под тегами «Ли» следующим

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

Не хотите '// div [@ id =" all-stories "]/ul/li/text()'? – kgraney

+0

@kgraney Я пробовал подход, но не получил результат. –

ответ

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

урожаи

('book1_url', 'Book1') 
('book2_url', 'Book2') 

XPath //div[@id="all-stories"]/div ничего не соответствует, потому что нет ни одного ребенка div внутри наружный div бирка.

XPath //div[@id="all-stories"]/li также не будет соответствовать, потому что нет прямого ребенок li Тагя внутри div тега. Тем не менее, //div[@id="all-stories"]//liделает соответствует li тегам, потому что // сообщает XPath рекурсивно искать настолько глубоко, насколько необходимо, чтобы найти теги li.

Теперь ваш контент не указан в теге li. Он находится внутри тега a. Вместо этого используйте XPath '//div[@id="all-stories"]//li/a', чтобы достичь тегов a. Доступ к атрибуту href можно получить с помощью atag.attrib['href'], а текст - atag.text_content().

Смежные вопросы