2013-07-31 19 views
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規範化了,但是正則表達式對於這類工作似乎永遠不是一個好選擇......任何幫助表示讚賞!

回答

1

這可能不是那麼糟糕只是做一堆'或'。使用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) 
+0

我喜歡這種方法......我只是在等待,看看在接受它之前是否有更短的/更高效的解決方案。你有什麼更快的線索:在html文檔或這個相當長的xpath上使用一個正則表達式? –

+0

@Nasmon - 我的直覺是正則表達式會快一點,但是我一直在使用很多xpath的項目,並且它們運行正常。這可能都是過早優化的情況。正則表達式的HTML文檔是有問題的 - 你想堅持一個XML解析器 - 但在xpath中使用正則表達式可以。 – tdelaney

相關問題