XPath是做xml和html解析的时候,最重要的技术之一,爬虫更需要的是如何解析查询回来的数据,爬取本身没什么难的发一个http请求,返回response就是了,response回来的有可能是html,有可能是json,文本信息我们关注,非文本不关注,更关注爬取的内容,被html包含之内的文本信息是要我们关注的。
**
我们前面生成的表格,表格的数据是我们关注的,表格标签不关注,只不过标签的是定位数据用的,在网页中如何定位你要的内容很重要。在爬取网站的用xhr,用ajax的方式去后台拿到了数据,这个是拿到了json数据,我们还需要解析json数据,但是更多的情况下,是拿到了html。
前面的方式正则表达式,css,XPath,这三种方法是最常用的方式**
这里也是一些最常用的语法
函数,轴,谓语条件,一般能用最简单的方式提取到函数就可以了,能不用轴就不用轴
编程的时候应该用lxml库,是python下功能比较丰富的库
看一下官网,底层封装了c的库
一般都从etree开始
装一下即可,因为是封装了底层的c的库,它的效率很高
看看能不能用
这两个元素对象能否看到
可以打印它的标签
这是元素对象,能否组合在一起,可以这样把另一个元素对象加入其中
append往往是在节点内部追加,打印tostring看看即可
也就是body开始,将它的html输出
这就是我们定义好的
打印body就只剩下body了,从谁开始输出
**在body也可以append,body里追加这些元素
**
从root来看
元素之间也有其他方式,比如子,要写清楚相对于谁的子
相对于body的子,顺便看看返回的类型是否是元素
这个tag就是创建好的子元素
可以试试链式编程,在里面append,这个时候顺便把子元素造出来,直接在内部追加
现在就 打印好了,2里面2-1
可以用漂亮打印的方式
需要decode转一下,转成string,可以用它来构造一个xml
构建一个xml
还提供两个非常有用的东西,html,一个叫path。
在etree调用HTML,里面放入一些文本(标签字符串或者由你读回来的html文本),就可以解析,返回一个根节点
由这个根节点开始向下,用xpath,然后xpath路径找相应的节点
这边的内容应该不是json过来的,左边是XHR,json数据过来的
可以在chrom装一个工具
打开开发者模式,加载已经解压缩的插件
我们可以对这个直接进行爬取
这个数据在这里
选择的内容正好在这个框子内,class可以理解为唯一的,因为不同的class要进行样式的控制
】这里找div有class属性的有295个,也就是几乎所有div都有class
现在就只有一个
】我们还需要底下的内容
到下面找所有的a,这里是它帮我们取的内容,但是到这里其实我们取的是a标签,不是里面的内容
写爬虫就是要跟着网页变的,网页布局变了你的爬虫也需要变,否则爬不到东西
现在准备抓一个文件
看看400个
etree有个方法,我们把html送进去
得到一个节点,得到一个element
还可以打印下tag,说明拿到了html
拿到之后用XPath来解析,在root节点上找XPath,再次打印titles,看看信息,这样就可以拿到想要的内容
将所有文本节点返回,下面就是你遍历的问题
注意点,一定要修改user-agent,如果用爬虫,连续发起几百次请求,对方服务器可能就不乐意了
把它省去了也可以,写法有很多
找个td有class叫title,这样就更简单
但是有时候可能title很多
往往包住它的div是唯一的,底下的title可能不唯一
虽然案例小,但是这就是爬虫
对XPath的进一步包装,beautifulsoup4
这个文档很好
直接去安装即可
安装
创建个新的python文件试试
这么用,请你给第一个参数传markup,塞个标签即可,要一个标签字符串,或者给一个含有标签对象的文件对象fileobject,给一个文件对象,自己去里面取内容,把内容read出来后进行分析,beautifulsoup(也是做解析的)。
现在讲的都是爬到的东西如何分析,XPath是用lXML这个库来做提取内容,beautifulsoup是来做解析的,做html解析的。
第二个参数 features要指定解析器,用什么解析器来解析文件
一个是文件对象,一个是字符串,如何选择解析器是要注意的地方
可以不指定解析器,就依赖系统已经安装的解析器库了,不安装lxml 就用内建的,就是python的
,没有安装lxml就用内建的,这是python内建的标准库,执行速度一般,文档容错能力蛮强的,但是纠正是按照自己的想法来做的,纠正的能力很有限,但是也不会写错的html
lxml解析器,需要安装C库,python已经安装了
还有html5的lib,速度慢,容错性好
一般都用lxml,builder就是内建的解析器
指定解析器就换了,基本上在开发中都用这个解析器
测试的html
**beautifulsoup提供了4种对象,把html解析生成一个复杂的树形结构,将里面的内容解析成4种对象:
1.beautifulsoup
2.tag 标签对象
3.navigablestring 可以导航的string,文本对象,text,包括注释,包括文档 说明的一些信息,都是归类到navigablestring
4.comment 注释信息 <!-- --》 **
创建的beautifulsoup代表整个文档
tag对应标签
每个标签有自己的属性,常用的两个:
1.name:tag
2.attrs
class是可以写多个class,空格隔开,也是个多值字典,在这个值上用的列表,如果说要访问h3的就用这个方式
这样不行直接报错,需要指定编码
是编码格式不对,windows默认gbk,所以要用utf-8打开
先找一个p标签试试,只打印了一个p标签对象,它的特点是深度优先,遇到div钻进去,找到第一个p标签就返回,深度优先,往里面去的
id是通过一个字符串来表达在页面里是唯一的,最典型的多值是class
找到第一个就不往下找了,这个class就有一个列表
div找到第9行的就不往下找
返回的类型是tag
这个属于这个字符串表达,这种方式下很难找到它的兄弟
有点像xpath的意思,但是xpath等于贪婪的,满足条件的都会匹配出来,所以满足的太多了我们就需要加条件,加class=什么。id=什么
还可以这么用,问class=content的div,id是多少
问问class
这就跟字典的get方法一样,
attrs返回的是典型的字典
attrs是字典就可以写成这样
字典默认get拿不到就返回none,可以写默认值
第一个div是有id的
这种快捷的方式,就是把它当做容器看
这样就keyerror了
、
这种方式访问没有就抛出keyerror异常,有风险
把元素当字典,最终实现的还是把attrs上的字典应该如何去处理,既然是个字典,该keyerror就keyerror
除了拿属性还可以修改属性
第一个img可以看一下它的src
甚至还可以修改,都可以动态去修改
找不到就返回none
故意写个都没有的,标签在不在就返回none
一般不用上面的方式,只是去理解标签类型,属性以及访问方式
还有一种类型navigableString
h3现在是字符串表达形式
把里面的用string打印却不可以
p标签里面有文字就可以
a标签的string也打印一下
里面有文字可以用string,相当于读取里面的文字信息,相当于标签内部的文本信息
如果想要里面的信息就这么读取就行,第一个div下的p标签,这两个在标签属性结构是一个东西
还有一个类型注释对象
注释对象对应这段
一般都是从soup对象开始.标签就会去里面深度优先搜第一个标签,搜到之后可以访问属性,常用的属性有name和attrs,attrs有可能是多值属性,比如class,多值属性会返回一个列表。有快捷的访问方式,将自己的这些方法在自己的标签类上也实现了一遍,这样可以把标签本身当属性字典来用。
可以访问标签,找不到返回none,如果属性找不到看你用什么方式,如果【】中括号方式找不到就是keyerror。
还有个类型就是navigablestring,往往读取的都是文本信息内容,我们更关注标签内部有没有文本