response的几个小知识点:
1.response.text 和response.content有什么区别?
答:%1. response.content这个是直接从网络上抓取的数据,没有经过任何解码,所以返回的数据类型是一个bytes类型。(在硬盘上和在网络上传输的字符串都是bytes类型。)
%2.response.text这个是方法返回的数据类型是文本形式。他其实是将response.text返回的bytes类型的数据进行了解码
2.response.encoding是做什么用的?
查看响应头部字符编码
3.response.status_code是做什么用的?
查看响应的状态码,如果是200的话表示正常,否则错误。
下面我们来了解一下xpath
首先我们先来了解一下从网上爬取数据的方法有哪些?(之前在爬虫知识点总结这篇博客中写过)
%1.xpath(一般用来爬取小型的数据,比较简单)
%2.urlib模块(urllib模块只接受字符串参数,不能指定请求数据的方法,更无法设置请求报头。因此,urllib2被视为爬取数据所用“浏览器”的首选。)
%3.bs4(全称:beautifulsoup4Beautiful Soup他是python的第三方库,可以帮助我们从网页源码中找到我们需要的数据。Beautiful Soup可以从一个HTML或者XML提取数据,它包含了简单的处理、遍历、搜索文档树、修改网页元素等功能)
%4.re正则(爬取大量数据)
四种安装方法都是:pip install ^^
好,下面我们来详细讲解一下xpath这种方法
1.安装:pip install xml
pip install xpath
XPath 使用路径表达式在 XML 文档中选取节点,节点是沿着路径或者 step 来选取的。
2.什么是xml?
xml是用来存储和传输数据使用的。
(图片来自w3cSchool截屏,关于xml大家可以在w3cschool上详细了解。参考链接:http://www.w3school.com.cn/xml/xml_intro.asp)
扩展:xml与HTML的区别?
$1.XML 被设计为传输和存储数据,其焦点是数据的内容。
$2.HTML 被设计用来显示数据,其焦点是数据的外观。
$3.HTML 旨在显示信息,而 XML 旨在传输信息。
$4.HTML中的标签是固定的,xml中的标签是自定义的。
3.什么是xpath?
xpath用来在xml中查找指定的元素,他是一种路径的表达式。
4.常用的路径表达式:
nodename 选取当前节点的所有子节点
/ 从根节点选取
// 不考虑它们的位置 从匹配选择的当前节点选择文档中的节点
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性
5.实例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE school SYSTEM 'school.dtd'>
<students>
<student class='1807c1'>
<name len=2>苗子</name>
<sex>女</sex>
</student>
<student class='1807C2'>
<name len=3>李小花</name>
<sex>女</sex>
</student>
</students>
ps:这个文件是我用记事本写的,然后修改了他的扩展名才得到为xml文件,或者你们可以使用xml编辑器。
/students/student: 选取根节点students下面所有的student
//student: 从当前节点不按照位置查找student元素
/students/student[1]: 从根节点students下查找子节点student下的第一个元素
/students/student[last()]: students下的最后一个元素
/students/student[last()-1]: students 下的倒数第二个元素
//name[@len]: 所有带有len属性的name元素
6.选取未知节点:
*(星花) 匹配任何元素节点
@ * 匹配任何属性节点
node() 匹配任何类型的节点
实例:
/students/* 选取 students 元素的所有子节点
//* 选取文档中的所有元素
//name[@*] 选取所有带有属性的name元素。
在pycharm中操作:
1.导入库:
from lxml import etree
2.获取文件
tree=etree.parse(文件名)
或者
tree=etree.HTML(网页字符串)
小案例:
from lxml import etree
#生成对象:
tree=etree.parse('xpath.html')
res=tree.xpath('//div[@class=”tang”]/ul/li[1]/text()')#打印出文本的内容
print(res)#返回的结果是一个列表
ps:大致的套路就是这样了,泥萌下去可以练习练习
4、 //tr[position()>1]这个规则是用来匹配什么的?
从第二个标签进行全局查找所有的tr标签
5 、//a/@href这个规则是用来查找什么的?
全局查找a标签下的href属性
6、 ./td[3]/text()这个规则是用来查找什么的?
当前标签下查找第三个td标签中的文本内容
7 、 //div[@class=‘nowplaying’]//ul[@class=‘lists’]/li这个规则是用来查找什么的?
从class=‘nowplaying’的div下进行全局查找所有的属性为class=‘lists’ 的ul标签下的直接节点li
8、 ./td[1]/a/text()/这个规则是用来查找什么的?
他是用来在当前标签下查找第一个td的子节点a标签的文本内容
9、 /html/body/p/这个规则是用来查找什么的?
从根节点开始查找html下的直接子元素body的直接子元素p标签
10、.//td[@class=‘even’ or @class=‘odd’]这个规则是用来查找什么的?
从当前标签下查找所有的属性为class=‘even’或者是属性为class=‘oddj’的td标签
11.tag.contents 和tag.childen 的区别?
同:查找当前标签下的所有字标签
异:contents返回值是list
childen返回的值是iterables(迭代器)
12.tag.find()和tag.find_all()的区别?
tag.find()查找第一个满足条件的标签。
tag.find_all()查找所有满足条件的标签
返回值都是一个列表
13.有变量名为tag的Tag类对象,请写出代码,打印输出当前tag标签下的所有a标签的链接地址
a_list=tag.find_all('a')
for i in a_list:
print(href[i])
14.有变量名为tag的Tag类对象,请写出代码,获取当前标签下的ul标签下的直接子标签li
a_list=tag.select('ul>li')
15.有变量名为tag的Tag类对象,请写出代码,获取当前标签下id='over’的标签下的class=‘content’的标签
t=tag.select('#over .content')