通过lxml/Python中的xpath,选择具有href属性的所有锚标记,该属性包含多个值中的一个



我需要自动扫描大量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."one_answers"other_ad_network."。然而,有超过25个域需要检查,如果用"或"连接所有这些conatains指令,xpath表达式会变得非常长。我担心这个表达式在CPU资源方面会非常低效。是否有一些语法用于检查多个"包含"值?

我也可以通过regex在一行代码中获得相关链接。然而,尽管html代码是由lxml规范化的,但regex似乎从来都不是这种工作的好选择。。。感谢您的帮助!

只做一堆'或'可能没那么糟糕。用python构建xpath,这样你就不会遇到编写器的抽筋,然后预编译它。实际的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)

最新更新