1. XPath

1.1 XPath简介

XPath,全称是XML Path Language,即XML路径语言,是一门在XML文档中查找信息的语言,也同样适用于HTML文档的搜索。

1.2 XPath使用

  1. 安装lxml库

    pip install lxml -i https://pypi.douban.com/simple

  2. 导入lxml.etree

    from lxml import etree

  3. etree.parse() 解析本地文件

    html_tree = etree.parse(‘XX.html’)

  4. etree.HTML() 解析服务器响应的文件

    html_tree = etree.HTML(response.read().decode(‘utf-8’))

  5. html_tree.xpath(‘xpath路径’)

1.2 XPath基本语法

  • 路径查询
    • //:从当前节点选取子孙节点,不考虑层级关系
    • /:从当前节点选取直接子节点
    • . :选取当前节点
    • .. :选取当前节点的父节点
  • 谓词查询(注意单引号和双引号的问题)
    • //div[@id]
    • //div[@id = “box”]
  • 属性查询
    • //@class
  • 模糊查询
    • //div[contains(@id,”he”)],表示id中包含关键字he的的div标签
    • //div[starts-with(@id,“he”)],表示id开头是he的的div标签
  • 内容查询
    • //div/h1/text(),查看标签内容
  • 逻辑运算
    • //div[@id =”head” and @class = “s_down”]
    • //div[@id =”head” or @class = “s_down”]

1.3 实践案例

获取百度网站的百度一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#-*-coding:utf-8-*-
#@Time:2022/4/614:32
#@Author:陈 玉 皓
#@File:解析_百度一下.py
#@Sofeware:PyCharm

import urllib.request
from lxml import etree

#(1)获取网页的源码
url = 'https://www.baidu.com/'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36'
}
#定制请求对象
request = urllib.request.Request(url=url,headers=headers)
#模拟浏览器访问服务器
response = urllib.request.urlopen(request)
#获取网页源码
content = response.read().decode('utf-8')

# print(content)

#(2)解析服务器响应的文件
tree = etree.HTML(content)

result = tree.xpath('//span/input[@id="su"]/@value')

#(3)打印
print(result)

获取站长素材前十页的老虎图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# -*-coding:utf-8-*-
# @Time:2022/4/614:54
# @Author:陈 玉 皓
# @File:获取站长素材前十页的老虎图片.py
# @Sofeware:PyCharm
import urllib.request
from lxml import etree


def create_request(page):
if page == 1:
url = 'https://sc.chinaz.com/tupian/laohutupian.html'
elif 1 < page < 7:
url = 'https://sc.chinaz.com/tupian/laohutupian_' + str(page) + '.html'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36'
}

request = urllib.request.Request(url=url, headers=headers)
return request


def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content


def down_load(content):
# 下载图片
tree = etree.HTML(content)
# 图片名称列表
name_list = tree.xpath('//div[@id= "container"]//a/img/@alt')
# 图片地址列表
src_list = tree.xpath('//div[@id= "container"]/div/div/a/img/@src2')

for i in range(len(name_list)):
name = name_list[i]
src = src_list[i]
#去掉_s就是下的高清图
url = "https:" + src.replace("_s", "")
urllib.request.urlretrieve(url=url, filename="./tigers/" + name + ".jpg")


# Think_pwd:214115
if __name__ == '__main__':
start_page = int(input('请输入起始页码:'))
end_page = int(input('请输入结束页码:'))

if end_page > 6:
print('您输入的页数大于总页数,请输入小于7的数字!')
else:
for page in range(start_page, end_page + 1):
# (1) 定制请求对象
request = create_request(page)
# (2) 获取响应对象
content = get_content(request)
# (3) 下载
down_load(content)

print("下载完成!")

2. Beautiful Soup

2.1 BeautifulSoup简介

  1. BeautifulSoup简称:

    1. bs4
  2. 什么是BeatifulSoup?

    1. BeautifulSoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据
  3. 优缺点?

    1. 缺点:效率没有lxml的效率高
    2. 优点:接口设计人性化,使用方便

2.2 安装以及创建

  1. 安装

    1. pip install bs4
  2. 导入

    1. from bs4 import BeautifulSoup
  3. 创建对象

    1. 服务器响应的文件生成对象

      soup = BeautifulSoup(response.read().decode(), ‘lxml’)

    2. 本地文件生成对象

      soup = BeautifulSoup(open(‘1.html’), ‘lxml’)

注意:默认打开文件的编码格式gbk所以需要指定打开编码格式

2.3 节点定位

  • 方法选择器:
    • find_all(),查询符合条件的所有元素的一个列表。
      • name:根据节点名来查询元素。例:find_all(name = 'ul')
      • attrs:根据属性来查询元素。例:find_all(attrs = {'id':'h1'})
      • text:根据传入的字符串或者正则表达式对象来匹配文本。例:find_all(text = re.compile('link'))
    • find(),查询符合条件的所有元素,只返回第一个元素。
  • CSS选择器
    • select(根据选择器的到节点对象)【推荐】
      • 根据标签获取节点:select(标签名)
      • 根据class获取节点:select(.class)
      • 根据id获取节点:select(#id)
      • 根据属性获取节点:select('li[class]')
      • 层级选择器:
        • 后代选择器:element element:div p
        • 子代选择器:element>element:div > p
        • 同级选择器:element,element:div , p
  • 节点信息
    • 获取节点内容:
      • obj.get_text()
      • obj.string
    • 节点属性:
      • tag.name 获取标签名
        • tag.name
      • tag.attrs 将标签属性值作为一个字典返回
    • 获取节点属性
      • obj.attr.get(‘title’)

2.4 Demo

获取星巴克菜单中的的菜品名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from bs4 import BeautifulSoup
import urllib.request

url = 'https://www.starbucks.com.cn/menu/'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

soup = BeautifulSoup(content,'lxml')
#//ul[@class="grid padded-3 product"]//strong
#获取食品名称列表
name_list = soup.select('ul[class="grid padded-3 product"] strong')

for name in name_list:
#获取节点内容
print(name.get_text())