栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Python

学习网络爬虫(2)

Python 更新时间:发布时间: 百科书网 趣学号
1 解析网页 1.1 使用正则表达式解析网页

常见的正则字符和含义

1.1.1 re.match方法

re.match 的意思是从字符串起始位置匹配一个模式,如果从起始位置匹配不了,match()就返回 none。
re.match 的语法为 re.match(pattern, string, flags=0),其中pattern是正则表达式,包含一些特殊字符,string 为要匹配的字符串, flags用来控制正则表达式的匹配方式,如果区分大小写、多行匹配等。
例如,我们想使用两个字符串匹配并找到匹配的位置,可以使用:

上述例子中的pattern只是一个字符串,我们也可以把它改成正则表达式。

正则表达式匹配中默认的贪婪模式总是尝试尽可能匹配多的字符,上述例子中are后限制了匹配。

1.1.2 re.search方法

re.match只能从字符串的起始位置进行匹配,而re.search扫描了整个字符串并返回第一个成功的匹配,例如:

其他方面 re.search 与 re.match 一样,可以参照上面的 re.match 来操作。

1.1.3 re.findall方法

上面说的两个方法中,我们只能找到一个匹配所写的模式,而findall可以找到所有的匹配,例如:

上述代码中的’[0-9]+'表示任意长度的数字,然后在后面的字符串中进行匹配。找到所有的结果,并以列表的形式返回。
使用re获取博客主页的标题。

import requests
import re
link = "http://www.santostang.com/"
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32',
    'Host':'www.santostang.com'
}
r = requests.get(link,headers= headers)
html = r.text
title_list = re.findall('

(.*?)', html) print (title_list)

1.2 使用BeautifulSoup解析网页

首先,安装 BeautifulSoup。一般推荐使用lxml的解析器,解析的更快。
使用BeautifulSoup获取博客主页文章的标题。

import requests
from bs4 import BeautifulSoup

link = "http://www.santostang.com/"
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32',
    'Host':'www.santostang.com'
}
r = requests.get(link,headers= headers)

soup = BeautifulSoup(r.text,"html.parser")
first_title = soup.find("h1", class_="post-title").a.text.strip()
print ("第一篇文章的标题是:",first_title)

title_list = soup.find_all("h1", class_="post-title")
for i in range(len(title_list)):
    title = title_list[i].a.text.strip()
    print ('第 %s 篇文章的标题是:%s' % (i+1, title))

运行结果为:
首先,使用BeautifulSoup(r.text,“html.parser”)将网页响应体的字符串转换为soup对象,然后就可以使用soup库的功能了。
find_all 的结果是一个列表,从中提取需要的标题即可。

1.3 BeautifulSoup 的其他功能
import requests
from bs4 import BeautifulSoup

link = "http://www.santostang.com/"
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32',
    'Host':'www.santostang.com'
}
r = requests.get(link,headers= headers)

soup = BeautifulSoup(r.text,"html.parser")
print (soup.prettify()) # 对代码进行美化

其实,BeautifulSoup对象是一个复杂的树形结构,它的每一个节点都是一个 Python对象,获取网页内容就是一个提取对象内容的过程。而提取对象的方法可以归纳为3种:
(1)遍历文档树
(2)搜索文档树
(3)CSS选择器
1.遍历文档树

就像爬树一样,例如:
print (soup.header.div.a)

可以通过children方法获得所有子标签,如果想要获得子子孙孙的节点,就要用.descendants方法。
除了获取子节点外,还可以使用.parent方法获得父节点的内容。
2. 搜索文档树
遍历文档树的方法使用的比较少,最常用的是搜索文档树。在搜索文档树时,最常使用的是 find()和find_all()的使用,已经在上一节爬取博客主页的文章标题中介绍过了。
还可以与正则表达式结合起来使用,例如:

3.CSS选择器
CSS选择器方法既可以作为遍历文档树的方法提取数据,也可以作为搜索文档树的方法提取数据。
首先,可以通过tag标签逐层寻找,例如:
soup.select("header h3")
也可以通过某个tag标签下的直接子标签遍历,例如:

print (soup.select("header > h3"))
print (soup.select("div > a"))

CSS选择器也可以实现搜索文档树的功能

1.4 使用lxml解析网页

还有一些解析库是使用的是Xpath语法(如lxml),同样是效率比较高的解析方法。lxml使用C语言编写,解析速度比不用lxml解析器的BeautifulSoup快一些。
使用lxml提取网页源代码数据有三种方法,即XPath选择器、CSS选择器和BeautifulSoup的find()方法。
例如代码:

import requests
from lxml import etree

link = "http://www.santostang.com/"
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32',
    'Host':'www.santostang.com'
}
r = requests.get(link,headers= headers)
html = etree.HTML(r.text)
title_list = html.xpath('/html/body/div[1]/div/div[1]/article[1]/header/h1/a/text()')
print (title_list)

额外加上a/text()


1.5 总结

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/889362.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号