ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

爬虫(7) - 网页数据解析(3) | lxml解析数据

2022-07-04 20:33:32  阅读:139  来源: 互联网

标签:xpath lxml text 爬虫 li item html 解析


什么是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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有