2016-09-19 10 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") 

全体の構造は同じにしてください。

現在divexampleclassクラスがあるかどうかを確認するにはどうすればよいですか?上記の例では

itemプロパティclassesを持っているが、私はこれが何を意味するのか理解していないlxml.html.HtmlElementクラスのものである:

クラス
「クラスの周りのセットのようなラッパー属性。

メソッドを取得します。
unreachable.classes(self)
- 「クラス」属性の周りのセットのようなラッパー。

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

それは__iter__メソッドを持つlxml.html.Classesオブジェクトを返し、それが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が必要ですが、ちょっと違います。

答えて

1

ITER の必要はif "exampleclass" in item.classes:だけで、より効率的に、正確に同じことを行い、ありません。差がセットに ITER を呼び出している

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") 

は、ここではその間違いルックアップリニアないセットを検索するための効率的な方法ではなく、大きな違いになりますが、いくつかのケースでは記念碑的なdiffrenceがあるでしょう:

あなたはまた、lxmlのを使用してcss selectorsを使用することができます
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 

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

場合によっては、あなたはまた、ABLかもしれ使用する電子は含まれています:

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

ニース、ありがとう。私はセレクタを使うことはできません。なぜなら、ループ内でクラスの有無にかかわらず 'div'sが必要であり、うまくいけばサンプルコードを更新する必要があるからです。 'exampleclass-numbertwo'クラスが存在する場合、' xpath'' contains'は問題になります。http://stackoverflow.com/a/1604480/188159 – qubodup

+0

@qubodupを参照してください。場合*。あなたは複数のクラスを探していますか、それともその単一のクラスだけを探していますか? –

0

あなたはエレガントmembership test operator inを使用することができます。

__contains__()を定義していませんが、 が x == zといくつかの値 zを反復しながら、生産 ある場合 x in yが真である、 __iter__()を定義しないユーザ定義クラスの場合
for item in tree.xpath("//div"): 
    if "exampleclass" in iter(item.classes): 
    print("foo") 

y以上。

関連する問題