例子:
html = """
- 哈哈
- Two
- Three
- Four
第一段
第2段
第3段
第4段
大师傅大师傅!!
第5段
第6段
嘿嘿嘿
- This is Text
"""
基本css选择器
CSS选择器中,最常用的选择器如下:
选择器描述举例
*通配选择器,选择所有的元素*
选择特定类型的元素,支持基本HTML标签h1
.选择具有特定class的元素。.class1
.特定类型和特定class的交集。(直接将多个选择器连着一起表示交集)h1.class1
#选择具有特定id属性值的元素#id1
if __name__=='__main__':
html = etree.HTML(html)
Csses = html.cssselect('*')
for css in Csses:
print (css.text)
该程序会输出所有标签的文本内容,即*表示选择所有的元素
Csses = html.cssselect('li')
for css in Csses:
print (css.text)
输出结果:
哈哈
Two
Three
Four
该程序会输出“li”标签的文本内容,即选择特定类型的元素,换成其他标签则显示相应的文本
Csses = html.cssselect('.text')
for css in Csses:
print (css.text)
输出结果:
This is Text
代码片中的.text表示选择class属性值为text的标签。
Csses = html.cssselect('li.four1')
for css in Csses:
print (css.text)
输出结果:
Four
代码片中的li.four1表示选择所有的li标签,class属性值包含four1的标签。
Csses = html.cssselect('#inner')
for css in Csses:
print (css.text)
输出结果:
呵呵呵
代码片中的#inner表示id属性值为inner的标签。
属性选择器
除了最基本的核心选择器外,还有可以基于属性的属性选择器:
选择器描述举例
[attr]选取定义attr属性的元素,即使该属性没有值[placeholder]
[attr="val"]选取attr属性等于val的元素[placeholder="请输入关键词"]
[attr^="val"]选取attr属性开头为val的元素[placeholder^="请输入"]
[attr$="val"]选取attr属性结尾为val的元素[placeholder$="关键词"]
[attr*="val"]选取attr属性包含val的元素[placeholder*="入关"]
[attr~="val"]选取attr属性包含多个空格分隔的属性,其中一个等于val的元素[placeholder~="关键词"]
Csses = html.cssselect('[href]')
for css in Csses:
print (css.text)
输出结果:
百度一下
代码片中的[href]表示包含href属性的所有标签
Csses = html.cssselect('[class=two]')
for css in Csses:
print (css.text)
输出结果:
Two
代码片中的[class=two]表示class属性值为two的所有标签
Csses = html.cssselect('[class^=t]')
for css in Csses:
print (css.text)
输出结果:
Two
Three
This is Text
代码片中的[class^=t]表示class属性值以t开头的所有标签
Csses = html.cssselect('[class$=e]')
for css in Csses:
print (css.text)
输出结果:
哈哈
Three
代码片中的[class$=e]表示class属性值以e结尾的所有标签
Csses = html.cssselect('[class*=r]')
for css in Csses:
print (css.text)
输出结果:
Three
Four
代码片中的[class*=r]表示class属性值包含r字母的所有标签
Csses = html.cssselect('[id~=inner]')
for css in Csses:
print (css.text)
输出结果:
呵呵呵
嘿嘿嘿
代码片中的[id~=inner]表示id属性值包含inner的所有标签,inner是一个单独的词,即如果有多个属性值,则必须以空格隔开
关系选择器
有一些选择器是基于层级之间的关系,这类选择器称之为关系选择器。
选择器描述举例
第二个选择器为第一个选择器的后代元素,选取第二个选择器匹配结果.class1 h1
> 第二个选择器为第一个选择器的直接子元素,选取第二个选择器匹配结果.class1 > *
+ 第二个选择器为第一个选择器的兄弟元素,选取第二个选择器的下一兄弟元素.class1 + [lang]
~ 第二个选择器为第一个选择器的兄弟元素,选取第二个选择器的全部兄弟元素.class1 ~ [lang]
Csses = html.cssselect('div li')
for css in Csses:
print (css.text)
输出结果:
哈哈
Two
Three
Four
代码片中的div li表示div标签下的所有li标签,中间用空格隔开
Csses = html.cssselect('div>a')
for css in Csses:
print (css.text)
输出结果:
百度一下
代码片中的div>a表示div标签下的所有a子标签,a必须是div的子标签
Csses = html.cssselect('li+li')
for css in Csses:
print (css.text)
输出结果:
Two
Three
Four
代码片中的li+li表示li标签和li标签是兄弟标签,满足这样条件的一共有三个。
Csses = html.cssselect('a+p')
for css in Csses:
print (css.text)
输出结果:
第一段
Csses = html.cssselect('a~p')
for css in Csses:
print (css.text)
输出结果:
第一段
第2段
第3段
第4段
第5段
第6段
联合选择器与反选择器
利用联合选择器与反选择器,可以实现与和或的关系。
选择器描述举例
,属于第一个选择器的元素或者是属于第二个选择器的元素h1, h2
:not()不属于选择器选中的元素:not(html)
Csses = html.cssselect('li,p')
for css in Csses:
print (css.text)
输出结果:
哈哈
Two
Three
Four
第一段
第2段
第3段
第4段
第5段
第6段
代码片中的li,p表示选择所有的li标签和p标签
Csses = html.cssselect(':not([class])')
for css in Csses:
print (css.text)
输出结果:
None
None
呵呵呵
百度一下
第一段
第2段
第3段
第4段
大师傅大师傅!!
第5段
第6段
嘿嘿嘿
代码段中的:not([class]表示选择不包含class属性的所有标签。