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课程的快速方法是什么?
在上面的例子中,item是lxml.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,我只是想以不同的方式对待其中的一些。
不需要iter,if "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)