天天看点

2020/04/02 04-find系方法参数、css选择器、Jsonpath

刚才是如何去搜索文档树,主要用的find系列方法可以让你去定位要找的元素们,find找一个,find_all找一批,find_all立即返回一个列表。

所有find系列参数都是一个原则,第一个叫name,官方称为过滤器filter,过滤器可以写5种形式:

1.标签,

2.正则

3.列表,

4.true或者none

5.函数

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

函数可以做增强功能,这个函数比较简单,经过测试,函数可以接收标签对象,可以对标签对象进行判断做相应的处理,最后返回true和false即可,有点像filter

2020/04/02 04-find系方法参数、css选择器、Jsonpath

如果用find系列函数定位的话可以像上面这么做

其实find_all函数内部还提供了很多参数

2020/04/02 04-find系方法参数、css选择器、Jsonpath

name已经测试过了

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

只要不是前面的关键字都被它收集,收集之后就会做为标签的属性

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

这个意思是只要不是前面的关键字都到kwargs,找id属性为main的标签

2020/04/02 04-find系方法参数、css选择器、Jsonpath

找bg1也是一个元素

2020/04/02 04-find系方法参数、css选择器、Jsonpath

现在是可以通过名称,现在试试正则表达式

2020/04/02 04-find系方法参数、css选择器、Jsonpath

找带id属性的标签,这样就找到所有的id,意思就是拥有id属性的标签有哪些

2020/04/02 04-find系方法参数、css选择器、Jsonpath

还有就是列表方式,套路都一样

2020/04/02 04-find系方法参数、css选择器、Jsonpath

可以通过谁是谁的方式来指定是什么样子,正则表达式还可以里面写或什么,列表也是或的意思

2020/04/02 04-find系方法参数、css选择器、Jsonpath

但是不支持函数,属性不支持函数,但是正则表达式引用就够了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

id是个单值的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这是把id值取出来

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

这就是要求这两个属性都有,and关系

2020/04/02 04-find系方法参数、css选择器、Jsonpath

试试class属性,classs是python的keyword,keyword是不允许冲突,关键字是不允许冲突的。所以需要价格下划线

2020/04/02 04-find系方法参数、css选择器、Jsonpath

还有一个这个,也有class

2020/04/02 04-find系方法参数、css选择器、Jsonpath

找到class没有问题,但是现在想要精确匹配下

2020/04/02 04-find系方法参数、css选择器、Jsonpath

写成title是拿到了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

highlight也拿到了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

故意少个e看是什么方式匹配

2020/04/02 04-find系方法参数、css选择器、Jsonpath

用正则表达式,包含一下

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里要用class_因为class是keyword

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

如果真的写在一起,按顺序写的一样是没问题的,不一样就匹配不了,或者用正则表达式来解决,另外三个中的任何一个也可以

2020/04/02 04-find系方法参数、css选择器、Jsonpath

class是多值的,多值的任何一个都可以匹配,多值要全长匹配就要写的一模一样

2020/04/02 04-find系方法参数、css选择器、Jsonpath

另一个参数attrs,属性

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这样也拿到了,要求属性里有id,id=first

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这次写class就没有问题了,是个字符串

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

跟刚才用class方式的要一致

2020/04/02 04-find系方法参数、css选择器、Jsonpath

顺序不对也匹配不上,跟class一致

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

这样可以

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

说明是1个and条件

2020/04/02 04-find系方法参数、css选择器、Jsonpath

事实上attrs这样的写法也是很强大的,不用XPath也可以快速定位到元素

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

text指的是文本,一般结合字符串,正则表达式,列表,true可以完成很多功能

2020/04/02 04-find系方法参数、css选择器、Jsonpath

里面返回文本

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

返回文本\w+,,返回了所有标签,是从跟 /开始的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

在p标签找文本符合指定的正则表达式

2020/04/02 04-find系方法参数、css选择器、Jsonpath

p标签有没有内容需要过滤下,或者链接过滤下有没有内容,或者span标签有没有文字,都可以通过这个方式去找,还可以把属性attrs加进去就变成了and条件,可以组合起来,所以查询能力很强

2020/04/02 04-find系方法参数、css选择器、Jsonpath

要求h开头或者p开头的,要求里面必须是英文的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里很特别返回的是tag对象

2020/04/02 04-find系方法参数、css选择器、Jsonpath

一个所有元素返回的是tag对象,另一个返回的是文本

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这是文档类型

2020/04/02 04-find系方法参数、css选择器、Jsonpath

返回的类型要关注下是否符合要求

2020/04/02 04-find系方法参数、css选择器、Jsonpath

还提供了一个limit,相当于给查询结构做一个限定

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

默认是递归的,false的话就直接找自己当前的了,不会再递归进去了,一般不会修改这个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

soup.p深度优先搜索到第一个,返回一个tag对象,soup(‘p’)返回一个list,这是他们的差别

2020/04/02 04-find系方法参数、css选择器、Jsonpath

find-all可以简写成第二个的样子

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

第一个相当于find_all,第二个soup.img

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这两个等价

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这三个是一个意思,上面两个找到一个a,第三个是找所有的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

第一个find_all省略就是第二个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这些就是各种参数,参数配合在一起可以查找我们要的元素,这就是提供的搜索文档树

搜索文档树还提供 了find方法,参数几乎和find_all一模一样

2020/04/02 04-find系方法参数、css选择器、Jsonpath

find_all返回一个列表,找不到空列表,find找到是一个元素对象,找不到就是none

2020/04/02 04-find系方法参数、css选择器、Jsonpath

有可能需要加try,找不到是none,none就不能get,注意抛出异常

2020/04/02 04-find系方法参数、css选择器、Jsonpath

CSS选择器

css选择器和xpath一样必须会上面的可以不会,只是通过上面的更加理解了元素包含什么东西,可以用可以不用,css和xpath是用beautifulsoup4最常用的来搜索我们要的数据的

css选择器和jQuery一样,用另一个方法,没有提供css方法,提供select方法,选择器选择,把css大多数用的选择器,往这里生搬一套就可以直接用了。。

标签名直接用,类名前加.点好,id名前加#,还有什么直接子,相邻兄弟选择器

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

类选择器

2020/04/02 04-find系方法参数、css选择器、Jsonpath

伪类只支持一种,这是直接子的选择器,相当于子标签里的所有p标签

2020/04/02 04-find系方法参数、css选择器、Jsonpath

查找nth-of-type意思

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

虽然是伪类,但是用p来限定,要提取p的类型,类型相同的第几个由你数字提供,第二个就变颜色了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

它的意思是参照p的类型,选第二个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

css3提供了很多这样的伪类,但是beautifulsoup只实现了这个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这是找divcontent下的p标签,跟他同类型的第二个

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

id选择器

2020/04/02 04-find系方法参数、css选择器、Jsonpath

p标签同时id=second

2020/04/02 04-find系方法参数、css选择器、Jsonpath

不管标签,找id=bg1

2020/04/02 04-find系方法参数、css选择器、Jsonpath

后代选择器

2020/04/02 04-find系方法参数、css选择器、Jsonpath

div下不管多少层,找p 标签

2020/04/02 04-find系方法参数、css选择器、Jsonpath

找到div下div,不管多少层找p标签

2020/04/02 04-find系方法参数、css选择器、Jsonpath

转换成XPath就是//div//div//p

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

中括号属性选择器,这意思是div下的p标签里的第一个与它响铃的标签有没有src

2020/04/02 04-find系方法参数、css选择器、Jsonpath

同一级里有没有img,img里有src

2020/04/02 04-find系方法参数、css选择器、Jsonpath

也就是先找到div下的第一个p标签,问直接兄弟里有没有src属性的,其他兄弟里有两个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

属性选择器

2020/04/02 04-find系方法参数、css选择器、Jsonpath

有没有src,src是不是等于/

2020/04/02 04-find系方法参数、css选择器、Jsonpath

完全匹配

2020/04/02 04-find系方法参数、css选择器、Jsonpath

前缀匹配

2020/04/02 04-find系方法参数、css选择器、Jsonpath

src是否符合后缀

2020/04/02 04-find系方法参数、css选择器、Jsonpath

src是否包含

2020/04/02 04-find系方法参数、css选择器、Jsonpath

class是否等于它或者是其中某一个,波浪线~代表某一个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

愿意用 soup提供的接口,或者css都可以

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

css选择器应该是重点,因为这里要用,jQuery也要用

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里用css选择器遍历整个树形结构找到想要的节点

这里伪类用的很少

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里叫直接子

2020/04/02 04-find系方法参数、css选择器、Jsonpath

子孙选择器,后代选择器,这里是任意层次的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

属性比较多,前缀后缀,包含,这是img里的src,一般只关心图片的src

2020/04/02 04-find系方法参数、css选择器、Jsonpath

等于其中一个可以这么写

2020/04/02 04-find系方法参数、css选择器、Jsonpath

执行一下

2020/04/02 04-find系方法参数、css选择器、Jsonpath

最后一个也选择上了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

写好一点就是加个引号

2020/04/02 04-find系方法参数、css选择器、Jsonpath

现在试过了两种方式,一种是文档的签后搜索,find和find_all,还有css选择器

2020/04/02 04-find系方法参数、css选择器、Jsonpath

string不能包含其他东西,只能是个文本

2020/04/02 04-find系方法参数、css选择器、Jsonpath

strings会迭代,将里面进行迭代,会保留空白字符

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里面会把空白字符删除

2020/04/02 04-find系方法参数、css选择器、Jsonpath

text本质上是get_text

2020/04/02 04-find系方法参数、css选择器、Jsonpath

看下text源码

2020/04/02 04-find系方法参数、css选择器、Jsonpath

all_strings 默认把空白字符也放进来,然后迭代以后拼接起来,里面什么都有,text代表这些文本的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

单用text,跟直接调用get_text没什么区别

2020/04/02 04-find系方法参数、css选择器、Jsonpath

单独调用get_text等于getText

2020/04/02 04-find系方法参数、css选择器、Jsonpath

如果调用函数,还可以指定分隔符,指定要不要把这样的数据拿到,还可以提供types,不想要的内容

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这是把文档第一行也进来了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

去掉的话,我们放一个元素即可+个逗号

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

all_stirngs这边就要通过strip来决定要不要给你strip

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

如果text这个东西,直接用text是带空白字符的,如果要是不用就soup.div.get_text(strip=true)把空白字符去掉

2020/04/02 04-find系方法参数、css选择器、Jsonpath

用css选择器也好,还是现在提供的方式,还是find_all,总之只要找的是一个元素,我们要处理的都是一个个元素对象,我们一般都关心元素里的文本是什么,文本里有空白字符,如果要去掉就需要调用get也就是get_text,在这里传入strip=true

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

json解析

之前的豆瓣热门返回的是json,好歹需要把json.loads下变成一个字典,列表,一个json对应到列表和数组是没有问题的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

拷贝链接地址

2020/04/02 04-find系方法参数、css选择器、Jsonpath

现在就需要import requests 链接到外面去了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

response.text是连unicode编码都帮你做了,把text送进来,给soup处理,现在是把标签内容直接进来了,也可以放文件对象来读取

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这个文本里就是html标签,这就是response的正文部分

2020/04/02 04-find系方法参数、css选择器、Jsonpath

然后下面进行处理

2020/04/02 04-find系方法参数、css选择器、Jsonpath

beautifulsoup还给我们套了个标签,所以这个时候用它分析不合适

2020/04/02 04-find系方法参数、css选择器、Jsonpath

可以用原生json来分析,simplejson也可以

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这个是真正的json

2020/04/02 04-find系方法参数、css选择器、Jsonpath

把json。loads进来就变成字典了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

找找评分大于8分的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

用map和filter其实就可以,filter过滤顺便可以搞列表解析式,生成器,表达式都可以出来,有可以自己写for循环来判断

2020/04/02 04-find系方法参数、css选择器、Jsonpath

有个库叫jsonpath

2020/04/02 04-find系方法参数、css选择器、Jsonpath

就是把json类似于XPath一样来解析,但是不能用Xpath语法,重新定义了语法

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

*一切的根从$符号开始,类似jQuery,当前节点是@符号,是通配符

2020/04/02 04-find系方法参数、css选择器、Jsonpath

…相当于XPath的双斜杠

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

安装

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

官网

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里有一个XPath和jsonPAth的对比

2020/04/02 04-find系方法参数、css选择器、Jsonpath

他们两个的…表达意思完全不同

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

XPath不支持切片,jsnpath支持

2020/04/02 04-find系方法参数、css选择器、Jsonpath

谓语

2020/04/02 04-find系方法参数、css选择器、Jsonpath

jsonpath()是做计算的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

xpath()是做分组

2020/04/02 04-find系方法参数、css选择器、Jsonpath

要看大于8分的有几个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

套了一个大字典,里面是一个数组,数组里是一个对象,json格式的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

装一下扩展,解析json的时候很多人喜欢用

2020/04/02 04-find系方法参数、css选择器、Jsonpath

现在拿到的数据有纯html和XML的,这种就用beautifulsoup和lxml来解析,但是现在遇到json,往往不能解析,都会转成python的数据结构来处理

直接访问是个包不能使用

2020/04/02 04-find系方法参数、css选择器、Jsonpath

需要包下的jsonpath

2020/04/02 04-find系方法参数、css选择器、Jsonpath

放入上面的subjects对象也就是loads后得到的,后面就是表达式,从/跟开始任意层次先找个title

2020/04/02 04-find系方法参数、css选择器、Jsonpath

$就是/根。根jQuery一样,…代表//双斜杠,任意层次下的title

2020/04/02 04-find系方法参数、css选择器、Jsonpath

rs就需要解决找到8分以上的

刚才打印的title,title和rate是兄弟关系

2020/04/02 04-find系方法参数、css选择器、Jsonpath

先转换下,找到分值大于8的对象出来

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这是过滤器也就是条件

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这是刚好需要的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

官方的例子,book里面正好是个列表,到这里的子里面去找条件有这个情况的

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

要加字符串

2020/04/02 04-find系方法参数、css选择器、Jsonpath

现在已经找到大于8.0的分数,现在想要找到符合条件的title

2020/04/02 04-find系方法参数、css选择器、Jsonpath

找一下前10个到底有几个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

试试切片

2020/04/02 04-find系方法参数、css选择器、Jsonpath

取两个

2020/04/02 04-find系方法参数、css选择器、Jsonpath

根XPath一样也是先锁定到要的数据附近,然后看如何处理

这些数据有些是异步的,拿不到的,ajax填充过来的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

邪不压正怎么定位都在这里

2020/04/02 04-find系方法参数、css选择器、Jsonpath

查看源代码,邪不压中是找不到,也就是外面response回来的内容也是找不到的这四个字,因为邪不压中这些数据是发起了另外的请求,通过ajax来进行访问,访问到了通过js脚本动态加到DOM树里

2020/04/02 04-find系方法参数、css选择器、Jsonpath

这些数据是通过ajax动态增加到dom里的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

all里面是通过同步请求返回的,异步的数据,直接用爬虫爬取是爬不到的

2020/04/02 04-find系方法参数、css选择器、Jsonpath

所以要分析异步链接,对它发起请求

2020/04/02 04-find系方法参数、css选择器、Jsonpath

现在是获得的数据正好是json了才装载起来,然后对里面数据进行分析

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

这里一开始写整数不行,加上字符串就行了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

最后可以做个切片

2020/04/02 04-find系方法参数、css选择器、Jsonpath

XPath是掌握的重点

2020/04/02 04-find系方法参数、css选择器、Jsonpath

实例表需要熟悉

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

XPath的常用解析库就是lxml,可以解析html和xml,在其中使用XPath函数来进行对元素的定位和提取

2020/04/02 04-find系方法参数、css选择器、Jsonpath

但是这个lxml又被beautifulsoup包装了

2020/04/02 04-find系方法参数、css选择器、Jsonpath

beautifulsoup包装之后又提供一种很强大的访问方式,可以通过它的访问方式来访问,也可以通过提供的搜索功能find和find_all进行数据提取,

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

css选择器是非常重要的内容,把一些常用的选择器掌握即可

2020/04/02 04-find系方法参数、css选择器、Jsonpath
2020/04/02 04-find系方法参数、css选择器、Jsonpath

json解析作为了解,不强求

2020/04/02 04-find系方法参数、css选择器、Jsonpath