爬虫(7) - 网页数据解析(3) | lxml解析数据
作者:互联网
什么是lxml库
- lxml是一种使用Python编写的库,可以迅速、灵活地处理XML
- 支持XPath(XML Path Language)
学习lxml库的目的
- 利用XPath语法,来快速的定位特定元素以及节点信息
- 目的是提取出HTML、XML目标的数据
安装lxml库
pip install lxml
我之前已经安装过了,所以没有安装过程截图。
lxml库处理html文档数据
1 #导入lxml库,etree 2 from lxml import etree 3 4 5 #准备的html数据,不完整,html,body,li不完整 6 html_data = ''' 7 <div> 8 <ul> 9 <li class="item-0"><a href="link1.html">first item</a></li> 10 <li class="item-1"><a href="link2.html">second item</a></li> 11 <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li> 12 <li class="item-1"><a href="link4.html">fourth item</a></li> 13 <li class="item-0"><a href="link5.html">fifth item</a> 14 </ul> 15 </div> 16 ''' 17 #使用etree.HTML()自动补齐html 18 html = etree.HTML(html_data) 19 20 #返回的是一个二进制bytes类型的数据,需要使用decode转成string 21 # print(etree.tostring(html).decode()) 22 23 #返回_Element,就是整个xml树的根节点 24 # print(type(html)) 25 ''' 26 <class 'lxml.etree._Element'> 27 ['link5.html'] 28 ''' 29 30 #使用的是双斜杠;返回是一个列表;每一个元素都是element类型;列表里面的每一个element类型的元素就代表我们获取到的标签元素 31 result = html.xpath("//li/a/text()") 32 #获取li标签下面所有的class属性值 33 # result = html.xpath("//li/@class") 34 #获取的li标签href值为link1.html这个a标签,使用了单引号,如果外面使用的是 35 #双引号,内部一定要使用单引号,大家一定要注意 36 # result = html.xpath("//li/a[@href='link1.html']/text()") 37 #我们需要获取span标签,一定要注意span他是a标签的子元素,而不是li标签的子元素,使用双斜杠 38 # result = html.xpath("//li//span") 39 #我们使用了last()函数,最后一个标签,-1代表倒数第二个标签 40 # result = html.xpath("//li[last()]/a/@href") 41 42 print(result)
案例:lxml+xpath爬取图书数据
1 import requests 2 from lxml import etree 3 4 5 # 请求图书的页码链接 6 # 获取每一页图书数据,并抽取出图书数据 7 # 格式化每一条图书数据 8 9 def handle_list(item_list): 10 return "".join(item_list) 11 12 13 def handle_detail_xpath(content): 14 """ 15 解析图书数据,格式化每一条图书数据 16 :param content: 传入的response.text 17 :return: 18 """ 19 # 进行数据的实例化 20 html = etree.HTML(content) 21 # 获取所有的图书条目 22 all_book_items = html.xpath("//div[@class='col-md-7 flex-vertical description-font']") 23 for item in all_book_items: 24 # 获取到作者,出版社,价格信息 25 author_press_price = handle_list(item.xpath("./span[2]/text()")).split("/") 26 if len(author_press_price) == 3: 27 print( 28 { 29 # 从当前节点下使用xpath进行解析,如果不这么写//,.这个点需要大家注意 30 "title": handle_list(item.xpath("./span[@class='title']/text()")), 31 "author": author_press_price[0], 32 "press": author_press_price[1], 33 "price": author_press_price[2], 34 "summary": handle_list(item.xpath("./span[@class='summary']/text()")) 35 } 36 ) 37 38 39 def main(): 40 header = { 41 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36" 42 } 43 for i in range(1, 5): 44 url = "http://yushu.talelin.com/book/search?q=python&page={}".format(i) 45 response = requests.get(url=url, headers=header) 46 handle_detail_xpath(response.text) 47 48 49 if __name__ == '__main__': 50 main()
标签:xpath,lxml,text,爬虫,li,item,html,解析 来源: https://www.cnblogs.com/gltou/p/16334722.html