python 爬虫(七)lxml模块 + lxml数据提取(字符串的xml/html文件 |
您所在的位置:网站首页 › python如何从文件中读取数据内容的方法 › python 爬虫(七)lxml模块 + lxml数据提取(字符串的xml/html文件 |
爬虫小知识:爬取网站流程 确定网站哪个url是数据的来源。简要分析一下网站结构,查看数据一般放在哪里。查看是否有分页,解决分页的问题。发送请求,查看response.text里面是否有我们想要的数据内容。如果有数据,就用相应的提取数据的方法提取数据保存。注意:1.刚开做爬虫项目,先不要用类去做,只需要关注数据的来源等问题的解决,不要关注类结构的设计。 文章目录 一、lxml模块1. lxml简介与安装2. lxml初步使用1. 导包2.xml转成element对象的方法(1)将字符串形式的xml内容解析成可以调用xpath语法的element对象的方法 3. 将一个html文件转化成element对象的方法4. 如何将element对象转化成字符串的方法 二、在python中如何使用XPATH1. 使用xpath语法筛选元素2. 筛选元素各种方法实例 三、element对象调用xpath方法筛选数据案例1. 案例:获取扇贝单词中的python必背词汇2. 案例:获取网易云音乐歌手信息3. 案例:获取酷狗音乐的歌手信息 一、lxml模块 1. lxml简介与安装简介: lxml 是一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。 lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。 lxml python 官方文档: http://lxml.de/index.html 需要安装C语言库,可使用 pip 安装:pip install lxml (或通过wheel方式安装) 在这里我们用的Anaconda编译器,不需再安装 2. lxml初步使用我们利用它来解析 HTML 代码 1. 导包 from lxml import etree 2.xml转成element对象的方法 (1)将字符串形式的xml内容解析成可以调用xpath语法的element对象的方法 格式: from lxml import etree html_element = etree.HTML(html_str) 方法: etree.HTML(xml字符串) 解析的element对象是html格式 etree.HTML(xml字符串)案例: 返回值-------------->element对象 etree.HTML()可以帮我们补齐标签 小结:lxml可以自动修正html代码 3. 将一个html文件转化成element对象的方法 格式: from lxml import etree html = etree.parse('demo.html') # print(html) 方法: etree.parse(‘html文件’) 解析的element是xml格式,要注意标签头尾对应 etree.parse('html文件') 案例:![]() 格式: #初始化一个xpath解析对象 html = etree.HTML(text) result = etree.tostring(html,encoding='utf-8') ##解析对象输出代码 是一个bytes类型 print(type(html)) # print(type(result)) # print(result.decode('utf-8')) # 输出字符串 ## pretty_print=True 格式化输出,美观数据 print(etree.tostring(element对象,pretty_print=True,encoding='utf-8').decode('utf-8'))不解码是bytes类型: 案例:.decode(‘utf-8’)写在括号里面(不会加上html标签) 案例:.decode(‘utf-8’)写在括号外面(加html标签) 通过lxml模块,可以使用xpath语法来筛选元素(借用lxml模块返回的element对象) 1. 使用xpath语法筛选元素返回值element还可以继续调用xpath方法来继续筛选元素; element对象.xpath() 方法返回的是一个列表; 格式: html_element.xpath() 案例:加xpath来筛选元素
![]() 要特别注意的是这一串代码!!!!!!!!! result = point.xpath('//bookstore/book[position()1]/a/@href') type_name_url = html.xpath('//ul[@id="initial-selector"]/li[position()>1]/a/@href') # print(type_name_url) ## 找到A,B,Curl for type in type_name_url: ## 拼接url url = 'https://music.163.com'+type parse_type(url) ### 第一步:首页的解析,获取地区列表的url def parse(): html = get_xpath(base_url) # print(html) area_singer_urls = html.xpath('//ul[@class="nav f-cb"]/li/a/@href') #################### 去掉热门和推荐url############### area_singer_urls = [x for x in area_singer_urls if 'id' in x] ################ 拿到剩下的url ################# for url in area_singer_urls: new_url = 'https://music.163.com'+url parse_area(new_url) if __name__ == '__main__': parse() with open('singer.json','w',encoding='utf-8') as fp: json.dump(singer_infos,fp) with open('singer.json','r') as fp: print(json.load(fp)) 封装成面向对象 import json import requests from lxml import etree class Music_163: def __init__(self,url): self.url = url self.singer_infos = [] ### 通过url获取页面的xpath对象以便提取数据 def get_xpath(self,url): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36' } response = requests.get(url, headers=headers) return etree.HTML(response.text) ## 获取简介 def parse_detail(self,url, item): html = self.get_xpath(url) desc_list = html.xpath('//div[@class="n-artdesc"]/p/text()') desc = ''.join(desc_list) print(desc) item['desc'] = desc self.singer_infos.append(item) ### 第三步:通过传过来的A,B,Curl来提取对应页面的数据 def parse_type(self,url): ## 获取该页面的xpath html = self.get_xpath(url) singer_names = html.xpath('//ul[@id="m-artist-box"]/li/p/a/text()') singer_urls = html.xpath('//ul[@id="m-artist-box"]/li/p/a[1]/@href|//ul[@id="m-artist-box"]/li/a/@href') for i, name in enumerate(singer_names): item = {} item["歌手"] = name item['歌手连接'] = 'https://music.163.com' + singer_urls[i].strip() item['歌手详情页'] = 'https://music.163.com' + singer_urls[i].replace(r'?id', '/desc?id').strip() # print(item) url = 'https://music.163.com' + singer_urls[i].replace(r'?id', '/desc?id').strip() self.parse_detail(url, item) ### 第二步:解析每一个地区歌手页面 def parse_area(self,url): html = self.get_xpath(url) ## 获取A,B,C分类的url type_name_url = html.xpath('//ul[@id="initial-selector"]/li[position()>1]/a/@href') # print(type_name_url) ## 找到A,B,Curl for type in type_name_url: ## 拼接url url = 'https://music.163.com' + type self.parse_type(url) ### 第一步:首页的解析,获取地区列表的url def parse(self): html = self.get_xpath(self.url) # print(html) area_singer_urls = html.xpath('//ul[@class="nav f-cb"]/li/a/@href') #################### 去掉热门和推荐url############### area_singer_urls = [x for x in area_singer_urls if 'id' in x] ################ 拿到剩下的url ################# for url in area_singer_urls: new_url = 'https://music.163.com' + url self.parse_area(new_url) if __name__ == '__main__': base_url = 'https://music.163.com/discover/artist' m = Music_163(base_url) m.parse() with open('singer.json', 'w', encoding='utf-8') as fp: json.dump(m.singer_infos, fp) with open('singer.json','r') as fp: print(json.load(fp)) 运行结果![]() ![]() ![]() |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |