这个是合法的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我想要使用 - 大多数都有比这更多的元素,但这只是一个草图,让你知道我正在使用的是什么。
答案 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
但是因为你需要扫描链接,但实际上并没有给你买任何东西。