文章目录
数据解析
在大多数情况下, 我们并不需要整个页面的内容, 只需要一小部分, 这里就涉及到了数据提取的问题
下面介绍四种解析方式:
- re解析
- bs4解析
- xpath解析
- pyquery解析
这四种方式可以混合使用, 完全以结果为导向
网页前端结构
一个网页是由三个部分组成的: 分别是:HTML, CSS, JS(JavaScript)
- HTML:超文本标记语言,由一堆预设的标签(
<h1>一级标题</h1>)构成。HTML 负责网页的结构(页面元素和内容) - CSS:层叠样式表。CSS 负责网页的表现(页面元素的外观、位置等样式,如颜色、大小等)
- JS:全称为 JavaScript,简称 JS。负责网页的行为(交互效果)
- HTML: 超文本标记语言。
- 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。
- 标记语言:由标签 "<标签名>" 构成的语言
- HTML 标签都是预定义好的。例如:使用
<h1>展示标题,使用<img>展示图片,使用<video>展示视频。 - HTML 代码直接在浏览器中运行,HTML 标签由浏览器解析
- HTML 标签都是预定义好的。例如:使用
网页解析
网页解析指的是从原始HTML文档中提取数据的过程, 也是网络爬虫的关键步骤, 从一堆标签文本中提取出需要的数据.
lxml库
lxml: 是一个高性能的HTML/XML 文档的解析库, 支持基于Xpath 语法来解析获取网页数据
安装: pip install lxml
Xpath语法
Xath: 是一种用在HTML/XML文档中导航或定位元素的查询语言, 可以准确的定位文档中的特定元素, 属性或文本
| 表达式 | 描述 | 样例 |
|---|---|---|
/ |
从根节点的直接子元素 | /html/body/div/h1 |
// |
从任意位置选择节点 | //h1 |
. |
当前节点下查找 | ./a 与 .//a |
[n] |
选择第 n 个元素 | //p[2] |
[last()] |
选择最后一个元素 | //p[last()] |
[@attr] |
选择有该属性的元素 | //p[@color] |
[@attr='value'] |
选择该属性值等于指定值的元素 | //p[@color='red'] |
* |
匹配任何元素节点 | //body/div/* |
@* |
匹配元素的任何属性 | //body/div/a/@* |
text() |
获取文本内容 | //div/p/text() |
使用示例:
python
import requests
from lxml import html
target_url = 'https://www.tiobe.com/tiobe-index/'
# 发送请求, 获取数据
response = requests.get(target_url)
# 输出数据到控制台
# print(response.text)
document = html.fromstring(response.text)
with open('index.html', 'w', encoding='utf-8') as f:
f.write(response.text)
# 解析数据
# 解析表头
th_list = document.xpath("//table[@id = 'top20']/thead/tr/th/text()")
print("thead: ")
print(th_list)
tr_list = document.xpath("//table[@id = 'top20']/tbody/tr")
print("tbody: ")
for tr in tr_list:
td_list = tr.xpath("./td/text()")
print(td_list)