2016-09-19 47 views
2

我使用tree.xpath遍歷所有有趣的HTML元素,但我需要能夠判斷當前元素是否是某個CSS類的一部分。python lxml - 簡單地獲取/檢查HTML元素的類

from lxml import html 

mypage = """ 
<div class="otherclass exampleclass">some</div> 
<div class="otherclass">things</div> 
<div class="exampleclass">are</div> 
<div class="otherclass">better</div> 
<div>left</div>""" 

tree = html.fromstring(mypage) 

for item in tree.xpath("//div"): 
    print("testing") 
    #if "exampleclass" in item.getListOfClasses(): 
    # print("foo") 
    #else: 
    # print("bar") 

整體結構應該保持不變。

什麼是快速檢查當前div是否具有exampleclass類的方法?

在上面的例子中,itemlxml.html.HtmlElement類,它具有這樣的特性classes的,但我不明白這是什麼意思:


圍繞「類的一組類似的包裝屬性。

獲取方法:
unreachable.classes(self) - 圍繞「class屬性的集合類包裝。

設置方法:
unreachable.classes(self, classes)

它返回一個lxml.html.Classes對象,其中有一個__iter__方法,它原來iter()作品。所以我構造這個代碼:

for item in tree.xpath("//div") 
    match = False 
    for classname in iter(item.classes): 
    if classname == "exampleclass": 
     match = True 
    if match: 
    print("foo") 
    else: 
    print("bar") 

但我希望有一個更優雅的方法。

我試過尋找類似的問題,但我發現的所有東西都是各種各樣的「我如何獲得'classname'的所有元素」,但是我需要所有的div s在循環中,我只是想對待它們中的一些。

回答

1

沒有必要ITERif "exampleclass" in item.classes:做同樣的事情,只有更有效。

from lxml import html 

mypage = """ 
<div class="otherclass exampleclass">some</div> 
<div class="otherclass">things</div> 
<div class="exampleclass">are</div> 
<div class="otherclass">better</div> 
<div>left</div>""" 

tree = html.fromstring(mypage) 

for item in tree.xpath("//div"): 
    if "exampleclass" in item.classes: 
     print("foo") 

的區別是一組叫ITER使得查找線性所以肯定不是一個有效的方法來搜索一組,沒有太大的區別就在這裏,但在某些情況下,將有一個巨大的diffrence:

In [1]: st = set(range(1000000)) 

In [2]: timeit 100000 in st 
10000000 loops, best of 3: 51.4 ns per loop 

In [3]: timeit 100000 in iter(st) 
100 loops, best of 3: 1.82 ms per loop 

您還可以使用lxml的使用css selectors

for item in tree.cssselect("div.exampleclass"): 
    print("foo") 

視情況而定,也可能是你ABL使用包含:

for item in tree.xpath("//div[contains(@class, 'exampleclass')]"): 
    print("foo") 
+0

不錯,謝謝。我不能使用選擇器,因爲我需要循環中帶有和不帶有類的'div',更新示例代碼以希望更清晰。 'xpath'' contains'在存在類'exampleclass-numbertwo'的情況下會產生問題,請參閱http://stackoverflow.com/a/1604480/188159 – qubodup

+0

@qubodup,這就是爲什麼我添加*根據案件*。你在尋找多個班還是隻有一個班? –

0

可以優雅地使用membership test operator in:如果與x == z一些價值z是 生產

for item in tree.xpath("//div"): 
    if "exampleclass" in iter(item.classes): 
    print("foo") 

對於不定義__contains__()但 定義__iter__()用戶定義的類,x in y是真實的,而迭代超過y