0

我需要自动扫描大量 html 文档以查找被锚标记包围的广告横幅,例如:

<a href="http://ad_network.com/abc.html">
    <img src="ad_banner.jpg">
</a>

作为 xpath 的新手,我可以通过 lxml 选择这样的锚点,如下所示:

text = '''
    <a href="http://ad_network.com/abc.html">
        <img src="ad_banner.jpg">
    </a>'''

root = lxml.html.fromstring(text)
print root.xpath('//a[contains(@href,("ad_network.")) or contains(@href,("other_ad_network."))][descendant::img]')

在示例中,我检查了两个不同的域:“ad_network”。和“其他广告网络”。但是,有超过 25 个域需要检查,通过“或”连接所有这些包含指令,xpath 表达式会变得非常长。而且我担心这种表达方式在 CPU 资源方面效率很低。是否有一些语法可以检查多个“包含”值?

我也可以通过正则表达式在一行代码中获取相关链接。然而,虽然 html 代码由 lxml 规范化,但 regex 似乎从来都不是那种工作的好选择......感谢任何帮助!

4

1 回答 1

1

仅仅做一堆“或”可能并没有那么糟糕。用 python 构建 xpath,这样你就不会遇到 writer 的抽筋,然后预编译它。实际的 xpath 代码在 libxml 中,应该很快。

sites=['aaa', 'bbb']
contains = ' or '.join('contains(@href,(%s))' % site for site in sites)
anchor_xpath = etree.XPath('//a[%s][descendant::img]' % contains)
于 2013-07-31T16:51:50.727 回答