使用lxml迭代元素和子元素

时间:2013-01-28 21:46:53

标签: python lxml

这个是合法的lxml大师。我有一个网络抓取应用程序,我想迭代网站上的一些div.content(内容是类)标签。进入div.content标记后,我想查看是否有<a><h3>元素的子标记。通过尝试使用div.cont标记中的XPath创建列表,这似乎相对简单,即

linkList = tree.xpath('div[contains(@class,"cont")]//h3//a')

问题是,我想创建一个tuple,其中包含div.content框中的链接以及同一div.content框的paragraph元素中的文本。我显然可以迭代整个文档并存储所有段落文本以及所有链接,但我没有任何真正的方法将相应的段落与<a>标记匹配。

lxml的Element.iter()函数可以通过迭代所有div.cont元素,忽略那些没有<a>标记的元素,然后配对paragraph/a组合来实现这一点,但不幸的是似乎没有任何选项可以使用该方法迭代类名,只标记标记名。

编辑:这是我要解析的HTML的极其简化的版本:

<body>
<div class="cont">
    <h1>Random Text</h1>
    <p>The text I want to obtain</p>
    <h3><a href="somelink">The link I want to obtain</a></h3>
</div>
</body>

有许多这样的div.conts我想要使用 - 大多数都有比这更多的元素,但这只是一个草图,让你知道我正在使用的是什么。

1 个答案:

答案 0 :(得分:2)

您可以使用不太具体的XPath表达式:

for matchingdiv in tree.xpath('div[contains(@class,"cont")]'):
    # skip those without a h3 > a setup.
    link = matchingdiv.xpath('.//h3//a')
    if not link:
        continue

    # grab the `p` text and of course the link.

你可以扩展这个(雄心勃勃)并选择h3&gt; a代码,然后转到div.cont祖先(基于XPath query with descendant and descendant text() predicates):

for matchingdiv in tree.xpath('.//h3//a/ancestor::*[self::div[contains(@class,"cont")]]'):
    # no need to skip anymore, this is a div.cont with h3 and a contained
    link = matchingdiv.xpath('.//h3//a')

    # grab the `p` text and of course the link

但是因为你需要扫描链接,但实际上并没有给你买任何东西。