【文档说明】Python爬虫程序设计KC25.pptx,共(18)页,67.475 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2414.html
以下为本文档部分文字说明:
2.5.1使用CSS语法2.5.1使用CSS语法BeautifulSoup除了可以用find与find_all函数查找HTML文档树的节点元素外,还可以采用CSS类似的语法来查询,规则是:tag.select(css)其中tag是一个bs4.eleme
nt.Tag对象,即HTML中的一个element节点元素,select是它的查找方法,css是类似css语法的一个字符串,一般结构如下:[tagName][attName[=value]]其中[...]部分是可选的;tagName是元素名称,如果
没有指定就是所有元素;attName=value是属性名称,value是它对应的值,可以不指定属性,在指定了属性后也可以不指定值;tag.select(css)返回一个bs4.element.Tag的列表,哪怕只有一个元素也时一个列表;例2-5-1:soup.s
elect("a")查找文档中所有<a>元素节点;soup.select("pa")查找文档中所有<p>节点下的所有<a>元素节点;soup.select("p[class='story']a")查找文档中所有属性class="story"的
<p>节点下的所有<a>元素节点;soup.select("p[class]a")查找文档中所有具有class属性的<p>节点下的所有<a>元素节点;soup.select("a[id='link1']")查找属性id="link1"的<a>节点;soup.select("bodyheadtit
le")查找<body>下面<head>下面的<title>节点;soup.select("body[class]")查找<body>下面所有具有class属性的节点;soup.select("body[c
lass]a")查找<body>下面所有具有class属性的节点下面的<a>节点;<head>下面的<title>节点;例2-5-2:查找HTML文档中所有<p>下面的<a>的链接frombs4importBeautifulSoupdoc='''<html><head><title
>TheDormouse'sstory</title></head><body><pclass="title"><b>TheDormouse'sstory</b></p><pclass="story">Onceuponatimetherewerethreelittlesisters;an
dtheirnameswere<ahref="http://example.com/elsie"class="sister"id="link1">Elsie</a>,<ahref="http://example.com/l
acie"class="sister"id="link2">Lacie</a>and<ahref="http://example.com/tillie"class="sister"id="link3">Tillie</a>;andtheylivedatthebottomofawell.</p>
<pclass="story">...</p></body></html>'''soup=BeautifulSoup(doc,"lxml")tags=soup.select("p[class='story']a")fortagintags:print(tag["href"])程序
结果:http://example.com/elsiehttp://example.com/laciehttp://example.com/tillie另外我们通过tags=soup.select("p
a")tags=soup.select("a")tags=soup.select("p[class]a")等也可以得到一样的结果。2.5.2属性的语法规则在CSS结构中的[attName=value]中表示属性attrName与value相等,也可以
指定不等、包含等运算关系,具体运算如下表:选择器描述[attName]用于选取带有指定属性的元素。[attName=value]用于选取带有指定属性和值的元素。[attName^=value]匹配属性值以指定值开头的每个元素。[attNa
me$=value]匹配属性值以指定值结尾的每个元素。[attrName*=value]匹配属性值中包含指定值的每个元素。因此:•soup.select("a[href='http://example.com/elsie']")查找href="http://example.com/els
ie"的<a>节点;•soup.select("a[href$='sie']")查找href以"sie"结尾的<a>节点;•soup.select("a[href^='http://example.com']
")查找href以"http://example.com"开始的<a>节点;•soupselect("a[href*='example']")查找href的值中包含"example"字符串的<a>节点;2.5.
3select查找子孙节点2.5.3select查找子孙节点在select(css)中的css有多个节点时,节点元素之间用空格分开,就是查找子孙节点,例如soup.select("divp")是查找所有<div>节点下面的所有子孙<p>节点。例2-
5-3:查找子孙节点frombs4importBeautifulSoupdoc="<div><p>A</p><span><p>B</p></span></div><div><p>C</p></div>"soup=BeautifulSoup(doc,"lxml")tags=soup.sele
ct("divp")fortagintags:print(tag)程序结果:<p>A</p><p>B</p><p>C</p>其中tags=soup.select("divp")是查找<div>下面的所有子孙节点
<p>,因此包含<span>下面的<p>B</p>。2.5.4select查找直接子节点2.5.4select查找直接子节点在select(css)中的css有多个节点时,节点元素之间用">"分开(注意>的前后至少包含一个空格),就是查找直接子节点,例如soup.select
("div>p")是查找所有<div>节点下面的所有直接子节点<p>,不包含孙节点。例2-5-4:查找直接子节点frombs4importBeautifulSoupdoc="<div><p>A</p><span><p>B</
p></span></div><div><p>C</p></div>"soup=BeautifulSoup(doc,"lxml")tags=soup.select("div>p")fortagintags:print(tag)程序结果:<p>A</p><p>C</p
>其中tags=soup.select("div>p")是查找<div>下面的直接子节点<p>,因此不包含<span>下面的<p>B</p>。2.5.5select查找兄弟节点2.5.5select查找兄弟节点在select中用"~
"连接两个节点表示查找前一个节点后面的所有同级别的兄弟节点(注意~号前后至少有一个空格),例如soup.select("div~p")查找<div>后面的所有同级别的<p>兄弟节点。在select中用"+"连接两个节点表示查找前一个节点后面的第一个同级别的兄弟节点(注意+号前后至少有一个空格
)例2-5-5:查找兄弟节点frombs4importBeautifulSoupdoc="<body>demo<div>A</div><b>X</b><p>B</p><span><p>C</p></span><p>D</p></div></body>"soup=BeautifulSoup(
doc,"lxml")print(soup.prettify())tags=soup.select("div~p")fortagintags:print(tag)print()tags=soup.select("div+p")fortagintags:print(ta
g)程序结果:<p>B</p><p>D</p>其中tags=soup.select("div~p")找到<div>后面同级别的所有<p>节点,不包含<span>中的<p>C</p>,因为它与<div>不同级别。而tags=soup.select("div+p")要找
<div>的下一个兄弟节点<p>,但是<div>的下一个兄弟节点是<b>X</b>,不是<p>节点,因此没有找到,注意结果不是<p>B</p>。