此学习笔记整理于 Ryan Mitchell Web Scraping with Python- Collecting Data from the Modern Web (2015) Chapter 2 Advanced HTML Parsing
首先说明下我为什么要用这本书,因为这本书并不是入门书籍。那么我是不是小白呢!肯定是,那么为什么不用入门书籍呢?原因在于我之前自学过Python,然后断了,然后再学,然后再断。所以就选了这本,硬着来吧。
一,来,说一个函数吧。findAll
findAll(tag, attributes, recursive, text, limit, keywords)
第一个参数,tag。即上图中的span,string或者list (string就是文本,list就是列表,都是Python中的单元,可以查下看下就行,不查也行,字面意思,可能有些语法问题,暂时也不用知道吧)
第二个参数,attributes。即上图中的class=‘red’。dictionary (dictionary就是字典,key和value,即有键和值(键可以理解为索引),class是键,red是值)
第三个参数,recursive。我们打开的html形式的内容类似树状结构。如下图。这个参数就是问你是否要深挖结构,如果不深挖,就是大的树枝,如果深挖,set it true,就是大树枝挖完后还要挖大树枝上面的小树枝。例如,span下面如果还有一个低层级的span。当然了我也不知道有没有这样的结构,只是理解。默认值是True,深挖,毕竟是findAll。
第四个参数,text。作者说不常用,就是找对应的text。可以算出来对应的text在page里面出现了几次。findAll(text='XX')
第五个参数,limit,就是找几个吧。
第六个参数,keywords.直接上attributes我的理解,class=‘red’。作者说了,一般不用keywords,因为class是Python的保留词,虽然也可以加一个小横线class_=‘red’来用,但是也可以用 findAll(“”,{“class”:"red")来替代findAll(class_='red')。作者又说了,keywords可以帮我们进一步refine我们的内容,进一步筛选。
findAll是根据名字和属性attributes来确定tags的。
ok,函数说完。
下面的是如何根据位置来确定需要的tag的。
主要的就是两点,父子关系,后代和姐妹关系。children & parent,descendants and siblings。
在兄弟姐妹关系上,跳过了第一个,因为是next_siblings.同样的还有next_sibling。单数的兄弟姐妹
还有就是previous_sibling and previous_siblings。
二,正则表达式
先来一个笑话吧
Let’s say you have a problem, and you decide to solve it with regular expressions. Well, now you have two problems。
但我觉得,既然决定了要学Python,so, the only thing we have to fear is fear itself. 如果有一天我停更了,真是啪啪打脸啊。
举个栗子
下面有几个规则:
1,a至少写1遍,开头
2,后面正好跟了5个b
3,后面跟了偶数个c
4,最后d可选结尾。
感觉很直观吧!ok,rewrite in regular expression. regex
aa*bbbbb(cc)*(d | )
a 一个a
a* 若干个a,从0开始计数
(cc)这样的组合cc
(cc)* 这样的如何若干次
d | d or nothing
(d | )这样的组合
完成!
三,结合
需要加载re import re
\. 表示.
\/ 表示/
../img/gifts/imgXX.jpg (XX表示一位数或者两位数或者多位数)
四,lambda表达式
lambda表达式省去了定义函数的麻烦,直接用!findAll支持lambda表达式,但是!有一个前提,这个lambda的参数是tag,返回值是逻辑值boolean。
举个栗子
P.S.:没能上车的小伙伴欢迎留言,如果我会我直接回答你!如果不会,我谷歌后回答你!如果要加我微信,不行。