概述
一、数据解析常用的三种方式——②Xpath
1.调用时
from lxml import etree
2.转解析类型时
xpath_data = etree.HTML(data)#将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
3.xpath返回的数据类型是list,xpath的基本语法
#xpath 语法1.节点: / 2.跨节点: // 3.精确的标签: //a[@属性=“属性值”] 4.标签包裹的内容:text() 5.属性:@href
4.示例代码:
#安装支持 解析 html 和xml的解析库 lxml
#pip install lxml;xpath是一个语法,不是解析库
import requests
import re
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
url = 'http://news.baidu.com/'
data = requests.get(url,headers=headers).content.decode()
#print(data)
#1.转解析类型
xpath_data = etree.HTML(data)#将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
#xpath 语法1.节点: / 2.跨节点: // 3.精确的标签: //a[@属性=“属性值”] 4.标签包裹的内容:text() 5.属性:@href
#xpath返回的类型是list
#2.调用xpath的方法
# result = xpath_data.xpath('/html/head/title/text()')#'/'为根节点,不方便;输出:百度新闻——海量中文资讯平台
# result = xpath_data.xpath('//a/text()')#'//'为跨节点;取a标签包裹的内容
# result = xpath_data.xpath('//a[@mon="ct=1&c=top&a=30&pn=1"]/text()')# 精确的标签://a[@属性=“属性值”]/text()
# result = xpath_data.xpath('//a[@mon="ct=1&c=top&a=30&pn=1"]/@href')#取出链接
print(len(result))
print(result)
二、代码1——使用xpath解析方式爬取QZZN论坛中的帖子,将数据保存为json格式
import requests
from lxml import etree #xpath的库
import json #list转str
class QzznSpider(object):
def __init__(self):
self.base_url = 'https://bbs.qzzn.com/forum-133-'
self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
self.data_list = []#爬取数据的汇总,后续用self.data_list.append(xxx)的方式进行数据填充
#1.发请求
def get_response(self,url):
#网页的编码到底是gbk还是utf-8,进入抓取网页的开发者模式(F12),查询‘head-meta-charset=’能得到
#原因是抓取的网页的编码就是gbk的,所以解码的模式也要是gbk
data = requests.get(url, headers=self.headers).content.decode('gbk')#此时data数据类型是二进制,要实现翻页功能,而url是一个变量,需要外界拼接传入
return data
#2.解析数据
#使用xpath解析当前页面所有的帖子title和url 保存
def parse_data(self,data):
#2.1转换类型
x_data = etree.HTML(data)
#2.2根据xpath路径开始解析
title_list = x_data.xpath('//a[@class="s xst"]/text()')
url_list = x_data.xpath('//a[@class="s xst"]/@href')
for index,title in enumerate(title_list):#enumerate为枚举遍历
news={}
news['title'] = title
news['url'] = 'https://bbs.qzzn.com/'+url_list[index]#index输出依次为0,1,2,3,4....79(一页有80条帖子),实现了url的拼接
self.data_list.append(news)
#3.保存数据
def save_Data(self):
#使用with open 写入文件,所需的格式是str,所以需要将list转为str
data_str = json.dumps(self.data_list)#将list转为str
with open('05-example-QZZN.html','w',encoding='gbk')as f:
f.write(data_str)
# 4.启动
def run(self):
n = 100# n代表翻多少页
for i in range(1, n):
#4.1拼接完整的url
url = self.base_url+str(i)+'.html'
print(url)
#4.2发请求
data = self.get_response(url)
#4.3做解析
self.parse_data(data)#self.data_list.append(news),解析完数据就往init函数中的汇总列表中添加
#4.4数据持久化。翻页完毕,爬取的数据都保存在了大集合self.data_list,然后进行数据持久化。
self.save_Data()
#调用函数
QzznSpider().run()
最后
以上就是务实机器猫为你收集整理的【Xpath】、【使用xpath解析方式爬取QZZN论坛中的帖子标题及url】的全部内容,希望文章能够帮你解决【Xpath】、【使用xpath解析方式爬取QZZN论坛中的帖子标题及url】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复