这一节主要是编写代码熟悉一下xpath的基础内容
html文件源代码为:
<html lang="en"> <head> <meta charset="UTF-8"/> <title>测试bs4</title> </head> <body> <div> <p>百里守约</p> </div> <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> <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> </body> </html>xpath方法的演示如下:
from lxml import etree import requests if __name__=="__main__": #先实例化一个etree对象,然后调用etree对象中的xpath函数,将不同形式的xpath表达式作用到xpath表达式中,从而进行相关数据的解析和提取 #实例化好了一个etree对象,并将被解析的源码数据加载到该对象中。 tree = etree.parse('test.html') #调用xpath方法,返回的是一个列表,xpath表达式是通过层级关系进行标签的定位,这里我们想用xpath表达式定位到title标签 r = tree.xpath('/html/head/title')#html前面加个斜线是指从根节点(根目录)开始遍历的,中间的/表示一个层级 print(r) #返回的是一个列表,里面的元素是一个包含标签内容的Element类型的对象[<Element title at 0x1dcaedc6688>] #输出:[<Element title at 0x25ce42e6888>] #获取body下面的div标签 t = tree.xpath('/html/body/div') print(t) #返回的列表中是三个包含标签数据的element类型的对象 # 输出:[<Element div at 0x25ce42e6908>, <Element div at 0x25ce42e6948>, <Element div at 0x25ce42e6988>] e = tree.xpath('/html//div') #两个//表示的是多个层级,相当都bs4中的空格,/就相当于bs4中> print(e) # 输出:[<Element div at 0x25ce42e6908>, <Element div at 0x25ce42e6948>, <Element div at 0x25ce42e6988>] a = tree.xpath('//div')#从任意位置找div标签,也就是找html文件中的所有div标签 print(a) # 输出:[<Element div at 0x25ce42e6908>, <Element div at 0x25ce42e6948>, <Element div at 0x25ce42e6988>] b = tree.xpath('//div[@class="song"]') #//div指获取所有的div标签,用[@class="song"]来进行限制就可以通过属性定位,@后边是属性名称 print(b) # 输出:[<Element div at 0x25ce42e6948>] #定位到body下面,class属性值为song的div标签中的第三个p标签<p>苏轼</p>,也就是索引定位 c = tree.xpath('//div[@class="song"]/p[3]') #注意索引是从1开始的 print(c) # 输出:[<Element p at 0x25ce42eefc8>] d = tree.xpath('//div[@class="tang"]/ul/li[5]/a') print(d) # 输出:[<Element a at 0x25ce4306708>] # 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) # 输出:杜牧 f = tree.xpath('//li[7]/i/text()') print(f) # 输出:['度蜜月'] g = tree.xpath('//div[@class="tang"]//text()') #//text() 获取的是标签中非直系的文本内容(也就是标签中所有的文本内容) print(g) # 输出:['\n ', '\n ', '清明时节雨纷纷,路上行人欲断魂', ' ', '\n ', '秦时明月汉时关,万里长征人未还', ' ', '\n ', '歧王宅里寻常见,崔九堂前几度闻', ' ', '\n ', '杜甫', ' ', '\n ', '杜牧', ' ', '\n ', '杜小月', '\n ', '度蜜月', '\n ', '凤凰台上凤凰游,凤去台空江自流', '\n ', '\n '] #取属性:取img当中的src属性值 h = tree.xpath('//div[@class="song"]/img/@src') #取属性值可以是/@属性名称 print(h) # 输出:['http://www.baidu.com/meinv.jpg']