1

这是给合法的lxml大师的。我有一个网络抓取应用程序,我想在其中迭代div.content网站上的许多(内容是类)标签。一旦进入 div.content 标签,我想看看是否有任何<a>标签是元素的子<h3>元素。这似乎相对简单,只需尝试使用XPathdiv.cont 标签创建一个列表,即

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

问题是,然后我想创建一个tuple包含来自 div.content 框的链接以及来自同一 div.content 框的段落元素的文本。我显然可以遍历整个文档并存储所有段落文本以及所有链接,但是我没有任何真正的方法可以将适当的段落与<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 —— 它们中的大多数都有比这更多的元素,但这只是一个草图,让您了解我正在使用的东西。

4

1 回答 1

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>a标记,然后转到div.cont祖先(基于XPath 查询,带有后代和后代 text() 谓词):

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

但既然你需要然后扫描链接,实际上并没有给你买任何东西。

于 2013-01-28T22:26:49.660 回答