получить элементы списка внутри тега div с помощью xpath

у меня есть html, как это

<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, но, похоже, мой подход не работает. для простоты я попытался извлечь все элементы под тегами " li " следующим образом

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

1 ответов


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 tage внутри div - тег. Однако,//div[@id="all-stories"]//li тут матч li теги, потому что // говорит XPath рекурсивно искать так глубоко, как необходимо, чтобы найти li метить.

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