re+lxml+requests基础知识

来源:互联网 发布:linux下zip 编辑:程序博客网 时间:2024/05/29 04:45

python学习–re+lxml+requests

概括:requests用来爬取网页,而re和lxml从爬取的网页中提取信息,lxml为主re为辅;re也可用来获取带html标签的整段。

使用到的库:

re lxml requests
re >python自带的库,使用时只需导入即可:import re
lxml>第三方库,使用时需先安装,使用>>pip install lxml,安装失败的话(一般是因为超时),可更换包源:>>pip install lxml -i http://mirrors.aliyun.com/pypi/simple/ ,如果还不行就到https://pypi.python.org/pypi/lxml/3.4.2下载源码(.whl),cd到源码所在位置,pip install [packpages_name]进行安装(安装.whl文件需安装wheel包)。
requests>第三方库,使用前需先安装,安装方式同lxml,不过requests依赖很多包,一般有 certifi urllib3 chardet等,可根据错误提示进行安装。

re

正则表达式是最灵活最强大的工具之一,熟练使用正则表达式可极大地减少工作量,缺点是效率低(?)

一条正则表达式的组成单位

  1. 原子
    ->普通字符(大小写字母、数字、下划线)
    ->非打印字符(\n 、\t)
    ->通用字符 (如下表,只匹配一个字符)
    ->原子表([aA_5 ]匹配方括号中的任一个字符,[^Asf _]除了括号里的字符都能匹配)
符号 含义 \w 任意一个字母、数字或下划线 \W 除字母、数字或下划线以外的字符 \d 任意一个十进制数 \D 除十进制外的任意一个字符 \s 任意一个空白字符 \S 除空白字符外的任意一个字符

2. 元字符

符号 含义 . 除换行符外任意字符 ^ 匹配字符串开始的位置 $ 匹配字符串结束的位置 * 匹配0次、1次或多次前面的原子 ? 匹配0次或1次前面的原子 + 匹配1次或多次前面的原子 {n} 前面的原子恰好出现n次 {n,} 前面的原子至少出现n次 {n,m} 前面的原子至少出现n次,至多出现m次 | 模式选择符 () 模式单元符(可以把一个组合当成一个原子来处理)

3. 模式修正符

I >>> 匹配时忽略大小写
M >>>多行匹配
L >>> 做本地化识别匹配
U >>>根据Unicode字符解析字符
S>>>使 “.”可以匹配任意字符


re里的常见函数

result=re.match(pattern,string,flag)(从源字符串的起始位置匹配,不满足返回None)
result=re.search(pattern,string,flag)(扫描整个字符串进行匹配,全文搜索,只返回一个结果)
pattern:正则表达式 ; string:源字符串;flag:修正符;匹配位置:result.span();返回字符串:result.group().

上面两个函数只返回一个结果,怎样才能把匹配的字符串都返回呢?如下
>result=re.compile(pattern).findall(string)
>返回的是匹配的字符串列表

另外一个就是result=re.sub(pattern,new_str,string,count)
结果返回替换后的字符串,count是替换的次数
这个需求用自带的result=replace(old,new,str)函数都能满足我们。

>特别记忆点:匹配不以某字符串开头的string>>pattern=”^(?!abc).*”


lxml

在爬取过程中我们一般是先获得整个网页(一般情况),我们需要的信息就隐藏在其中,我们需要将他们提取出来,而提取的工具除了re外最好用的就是lxml了(当然还有beautifulsoup),lxml好用就好用在它的xpath上。

-基础

使用 lxml 需要先导入:from lxml import etree,etree有两个方法
html=etree.parse(‘http://www.baidu.com‘) 用来解析网页,也可以是本地文件
html=etree.HTML(str) 用来格式化字符串形式的网页文件,这两个结果都是 etree element对象,为后面使用xpath做基础。

-xpath
只要是etree element对象都可以使用xpath,xpath一般返回的结果是elemrnt tree对象列表。要获取字符串内容,
1、信息在标签属性中
result = html.xpath(‘//li[last()]/a/@href’)
print result >>>[‘http://www.baidu.com‘,]
2、信息在标签中
a=html.xpath(“//ul”)
print(a) >>>[“<”Element ul at 0x21c018ee908>]
print(a[0].text)>>>aaa

xpath语法:
egg1:
//div[@class=’list’]/a >>>选取class=list的div标签的子后代a标签
//div[@class=’list’]//a >>>选取class=list的div标签的后代a标签,无论是子后代还是孙后代。

>egg2:>`<html><body><div>    <ul>    aaa         <li class="item-0"><a href="link1.html">first item</a></li>         <li class="item-1"><a href="link2.html">second item</a></li>         <li class="item-inactive"><a href="link3.html">third item</a></li>         <li class="item-1"><a href="link4.html">fourth item</a></li>         <li class="item-0"><a href="link5.html">fifth item</a></li></ul> </div></body></html>`

from lxml import etree
html=etree.HTML(html)

a=html.xpath(“//ul”)
此时a是element 对象列表
print(a) >>>[“<”Element ul at 0x21c018ee908>]
print(len(a))>>>1
print(a[0].text)>>>aaa
说明当路径最后是标签名时,返回的是标签包含的字符串,

b=html.xpath(“//ul/li”)
print(b) >>>[“<”Element li at 0x2ba19e3e908>, “<”Element li at 0x2ba19e3e8c8>, “<”Element li at 0x2ba19e3e9c8>, “<”Element li at 0x2ba19e3ea08>, “<”Element li at 0x2ba19e3ea48>]

c=html.xpath(“//ul/li[1]/@class”)
print(c) >>>[‘item-0’]
当有多个匹配的标签时,可像列表一样指定某一个,不同的是从1开始。


requests

requests库(官方文档)封装了python其他的http相关的库,拥有丰富、统一、简单的API调用接口,极大地减少了代码量,缺点是我们不能接触到底层的实现原理,在完全掌握之后一定要把这些基础知识补上。2017-9-26。

请求
requests接口调用具体可参照requests文件夹下的api.py文件,里面有详细的说明
requests支持多种http请求类型,但最常见的是get、post请求
import requests
r=requests.request(method,url,**kwargs)
说明:method指http请求类型,形如:”GET”,大写且在引号里
url:”http://www.baidu.com“,
**kwargs指形如:key=value,这种形式的参数,在此API中有以下几种参数
params={}:get请求方式要传递的参数
data={}:post请求方式要传递的参数
headers={}:请求头部
cookies={} or CookieJar object :cookie
proxies={}:形如:{“http”: “http://10.10.1.10:3128“,}或者{“http”: “http://user:pass@10.10.1.10:3128/“,}
以下是不常用的
json=json data:
auth=auth tuple
timeout=float:单位是秒
allow_redirects=bool:默认是True

返回结果查询
r.status_code:返回请求的状态码,
r.headers:查看响应头
r.history:查看跳转历史
r.text:返回一个字符串,要改变其编码需要先r.encoding=’utf-8’
r.content:返回byte,可将其编码为需要形式,r.content.decode(‘utf-8’)
r.cookies:查看响应的cookie


requests的高级应用-session和cookie

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie
s=requests.Session()
jar = requests.cookies.RequestsCookieJar()
jar.set(‘tasty_cookie’, ‘yum’, domain=’httpbin.org’, path=’/cookies’)
s.get(‘url_1’,cookies=jar)#可以在请求中传入cookie
s.get(‘url_2)