第二篇 HTML元素的解析

Requests 库

这是一个网络请求库,主要的作用是可以模仿浏览器,发送网络请求,下载网页源码等。

上一篇已经讲了如何安装,不再赘述。

简单用法

 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中的getpost是最常用的两种请求,其他请求详见HTTP协议内容。关于Requests库的更多用法,查看其官方中文文档 http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

BeautifulSoup 库

关于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

BeautifulSoup中的解析器

该库的第二个参数是指定解析器,除了html.parser是内置解析器,其他三种都是第三方的解析器,需要单独安装,推荐lxml解析器,性能最好。

安装命令如下,安装后即可使用

1  python -m pip install lxml

CSS选择器语法

常用语法如下

语法

说明

*

选择所有节点

#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标签下的文本

本文分享自微信公众号 - 编程之路从0到1(artofprogram)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券