Python爬虫学习第三章-4.1.1-xpath解析概述
程序员文章站
2022-05-07 23:08:34
...
Python爬虫学习第三章-4.1.1-xpath解析概述
这一节主要是介绍xpath
1、xpath解析原理:
- 实例化一个etree类的的对象,并且需要将被解析的List item页面源码数据加载到该对象中。
- 调用etree对象中的xpath方法并结合着xpath表达式实现标签的定位和内容的捕获(捕获到的是标签或者标签属性中的文本内容)。
2、如何实例化一个etree类的对象:先from lxml import etree
- 将本地的html文档中的源码数据加载到etree对象中:可以调用
etree.parse(HtmlFilePath)
返回一个etree对象,其中参数是html文件的路径。 - 可以将从互联网上获取的页面源码数据加载到该对象中:
etree.HTML('page_text')
,page_text是从互联网上获取的响应数据 - 实例化etree对象完成后,就可以调用xpath(‘xpath表达式’)方法(返回的是一个列表),关键就是xpath表达式的编写,可以根据不同的xpath表达式定位到不同的标签以及捕获标签中的文本数据
3、xpath表达式(xpath函数返回的是一个列表):
-
形如’/html/body/div’:左边/表示的是从根节点开始定位,中间的‘/’表示一个层级,‘/’就相当于bs4中‘>’;‘//’表示的是多个层级,相当都bs4中的空格,也可以表示从任意地方开始定位。例如
tree.xpath('/html/body/div')
和tree.xpath('/html//div')
返回相同的内容,tree.xpath('//div')
是从任意位置找div标签,也就是找html文件中的所有div标签。 -
利用xpath进行定位:
- 利用xpath进行属性定位:例如定位到指定class='song’的div,可以用
tree.xpath('//div[@class="song"]')
,其中@是固定符号,通用写法是:tagName[@attrName="attrValue"]
。 - 利用xpath进行索引定位:例如定位到body下面,class属性值为song的div标签中的第三个p标签(
<p>苏轼</p>
),可以用tree.xpath('//div[@class="song"]/p[3]')
,注意索引是从1开始。
- 利用xpath进行属性定位:例如定位到指定class='song’的div,可以用
-
如何从xpath方法返回的element对象列表中取文本、取属性:
-
取文本:取的是标签中间的文本内容,用/text()或者//text()。比如取“杜牧”这两个字,而这两个字在class属性值为tang的div标签下面的ul标签下面的li标签下面的a标签中,所以可以通过层级来进行定位a标签,在HTML文件中源代码如下:
<div class="tang"> <ul> <li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂</a> </li> <li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还</a> </li> <li><a href="http://www.126.com" title="qi">歧王宅里寻常见,崔九堂前几度闻</a> </li> <li><a href="http://www.sina.com" title="du">杜甫</a> </li> <li><a href="http://www.dudu.com" title="du">杜牧</a> </li> <li><b>杜小月</b></li> <li><i>度蜜月</i></li> <li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流</a></li> </ul> </div>
可以通过下面的代码获取数据:
d = tree.xpath('//div[@class="tang"]/ul/li[5]/a') print(d) #输出的是:[<Element a at 0x2417b236788>] d_List_text = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()') #在最后加个text()就可以取到内容 print(d_List_text) #输出的是:['杜牧'] d_text = tree.xpath('//div[@class="tang"]/ul/li[5]/a/text()')[0] # 在最后加个text()就可以取到内容 print(d_text) #输出的是:杜牧
注意获取的是直系标签中的内容,比如
tree.xpath('//li[7]/text()')
返回的是空列表,但tree.xpath('//li[7]//text()')
或tree.xpath('//li[7]/i/text()')
就能返回内容。
也可以这样总结:
/text() 获取的是标签中直系的文本内容
//text() 获取的是标签中非直系的文本内容(也就是标签中所有的文本内容) -
取属性:取的是定位到的标签中的属性的属性值,用/@属性名称。比如取class属性值为tang的div标签下的img标签当中的src属性值。在html文件中源码如下:
<div class="song"> <p>李清照</p> <p>王安石</p> <p>苏轼</p> <p>柳宗元</p> <a href="http://www.song.com/" title="赵匡胤" target="_self"> <span>this is span</span> 宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a> <a href="" class="du">总为浮云能避日,长安不见使人愁</a> <img src="http://www.baidu.com/meinv.jpg" alt="" /> </div>
可以通过下面的代码获取数据:
h = tree.xpath('//div[@class="song"]/img/@src') #取属性值可以是/@属性名称 print(h) #输出的是:['http://www.baidu.com/meinv.jpg']
-
推荐阅读