这是一个网络请求库,主要的作用是可以模仿浏览器,发送网络请求,下载网页源码等。
上一篇已经讲了如何安装,不再赘述。
简单用法
1 # 导入
2 import requests
3
4 # 发起get请求
5 resp = requests.get('https://github.com/timeline.json')
6
7 # 可通过text获取网页源码,返回的是字符串类型
8 print(resp.text)
9
10 # 还可通过content获取返回的二进制类型
11 print(resp.content)
12
13 # 发起post请求
14 resp = requests.post("http://httpbin.org/post")
15
16 HEADERS={"User-Agent":""}
17 # 可通过headers参数设置请求头,参数是一个字典类型
18 resp = requests.get('https://github.com/timeline.json',headers=HEADERS)
HTTP中的get
和post
是最常用的两种请求,其他请求详见HTTP协议内容。关于Requests库的更多用法,查看其官方中文文档 http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
关于HTML的解析,推荐使用BeautifulSoup
库,因为简单易上手。
Beautiful Soup
中文文档 https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#
基本使用
1 from bs4 import BeautifulSoup
2 import requests
3
4 # 请求网页
5 resp = requests.get('http://www.pythonscraping.com/exercises/exercise1.html')
6
7 # 将网页源码作为第一个参数出入,第二个参数指定解析器
8 bsObj = BeautifulSoup
9
10 print(bsObj.h1)
使用CSS选择器提取网页标签实例
1 HEADERS = {
2 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'
3 }
4
5 resp = requests.get("https://www.tripadvisor.cn/Attractions-g293920-Activities-c47-t10-Phuket.html", headers=HEADERS)
6
7 # 这里使用lxml解析器进行解析
8 bs = BeautifulSoup(resp.text,"lxml")
9
10 # 调用BeautifulSoup的select函数,传入css选择器语法
11 for line in bs.select("div[class='listing_title '] a"):
12 print(line.string)
使用该库时,推荐使用CSS语法选择器进行标签提取,这种方式灵活且简洁。简单解释一下,"div[class='listing_title '] a"
语法的含义是指,提取所有的满足条件的div
标签下的a
标签。中括号括起来的就是一个条件,意即div
标签中必须有一个class属性,且该class属性中的值必须包含listing_title
。这行CSS选择器语法还有一个语义更明确的等价写法
div[class='listing_title '] > a
,其中>
表示下一级
实例如下图
select
函数返回的是一个所有满足条件的标签列表,如果要获取标签的文本内容,还要调一下.string
该库的第二个参数是指定解析器,除了html.parser
是内置解析器,其他三种都是第三方的解析器,需要单独安装,推荐lxml
解析器,性能最好。
安装命令如下,安装后即可使用
1 python -m pip install lxml
常用语法如下
语法 | 说明 |
---|---|
* | 选择所有节点 |
#container | 选择id为container的节点 |
.container | 选择所有class包含container的节点 |
div,p | 选择所有 div 元素和所有 p 元素 |
li a | 选取所有li 下所有a节点 |
ul + p | 选取ul后面的第一个p元素 |
div#container > ul | 选取id为container的div的第一个ul子元素 |
ul ~p | 选取与ul相邻的所有p元素 |
a[title] | 选取所有有title属性的a元素 |
a[href=”http://baidu.com”] | 选取所有href属性为http://baidu.com的a元素 |
a[href*=”baidu”] | 选取所有href属性值中包含baidu的a元素 |
a[href^=”http”] | 选取所有href属性值中以http开头的a元素 |
a[href$=”.jpg”] | 选取所有href属性值中以.jpg结尾的a元素 |
input[type=radio]:checked | 选择选中的radio的元素 |
div:not(#container) | 选取所有id为非container 的div属性 |
li:nth-child(3) | 选取第三个li元素 |
li:nth-child(2n) | 选取第偶数个li元素 |
a::attr(href) | 选取a标签的href属性 |
a::text | 选取a标签下的文本 |