使用xpath获取div标签内的列表项

时间:2013-06-29 13:49:13

标签: python xpath lxml

我有一个像这样的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>

我想使用xpath获取书籍及其各自的URL,但似乎我的方法无效。为简单起见,我试图提取“li”标签下的所有元素,如下所示

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

1 个答案:

答案 0 :(得分: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()访问文本。