0
我需要自動掃描大量的廣告橫幅HTML文檔由一個錨標記包圍,例如所有的錨標籤:選擇使用包含多個值中的一個通過的XPath LXML/href屬性的Python
<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」和「other_ad_network」。但是,有超過25個域需要檢查,通過將「或」連接到所有conatains-directive,xpath表達式會變得非常長。而且我擔心這個表達式在CPU資源方面會非常低效。是否有一些檢查多個「包含」值的語法?
我也可以通過正則表達式在單行代碼中獲得相關鏈接。然而,雖然html代碼被lxml規範化了,但是正則表達式對於這類工作似乎永遠不是一個好選擇......任何幫助表示讚賞!
我喜歡這種方法......我只是在等待,看看在接受它之前是否有更短的/更高效的解決方案。你有什麼更快的線索:在html文檔或這個相當長的xpath上使用一個正則表達式? –
@Nasmon - 我的直覺是正則表達式會快一點,但是我一直在使用很多xpath的項目,並且它們運行正常。這可能都是過早優化的情況。正則表達式的HTML文檔是有問題的 - 你想堅持一個XML解析器 - 但在xpath中使用正則表達式可以。 – tdelaney