python lxml - 简单地获取/检查 HTML 元素的类

qub*_*dup 5 python lxml class python-3.x

tree.xpath过去常常遍历所有有趣的 HTML 元素,但我需要能够判断当前元素是否属于某个 CSS 类。

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")
Run Code Online (Sandbox Code Playgroud)

整体结构应保持不变。

检查当前div是否有exampleclass课程的快速方法是什么?

在上面的例子中,itemlxml.html.HtmlElement类,它具有属性,classes但我不明白这是什么意思:

classes
围绕“class”属性的类似集合的包装器。

获取方法:
unreachable.classes(self) - 围绕“类”属性的类似集合的包装器。

设置方法:
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")
Run Code Online (Sandbox Code Playgroud)

但我希望有一种更优雅的方法。

我尝试搜索类似的问题,但我发现的只是“如何获取 'classname' 的所有元素”,但是我需要div循环中的所有s,我只是想以不同的方式对待其中的一些。

Pad*_*ham 6

不需要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")
Run Code Online (Sandbox Code Playgroud)

不同之处在于在集合上调用iter会使查找线性化,因此绝对不是搜索集合的有效方法,这里没有太大区别,但在某些情况下会存在巨大差异:

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
Run Code Online (Sandbox Code Playgroud)

您还可以使用 lxml使用css 选择器

for item in tree.cssselect("div.exampleclass"):
    print("foo")
Run Code Online (Sandbox Code Playgroud)

根据情况,您还可以使用 contains:

for item in tree.xpath("//div[contains(@class, 'exampleclass')]"):
    print("foo")
Run Code Online (Sandbox Code Playgroud)