
常见的正则字符和含义
1.1.1 re.match方法re.match 的意思是从字符串起始位置匹配一个模式,如果从起始位置匹配不了,match()就返回 none。
re.match 的语法为 re.match(pattern, string, flags=0),其中pattern是正则表达式,包含一些特殊字符,string 为要匹配的字符串, flags用来控制正则表达式的匹配方式,如果区分大小写、多行匹配等。
例如,我们想使用两个字符串匹配并找到匹配的位置,可以使用:
上述例子中的pattern只是一个字符串,我们也可以把它改成正则表达式。
正则表达式匹配中默认的贪婪模式总是尝试尽可能匹配多的字符,上述例子中are后限制了匹配。
re.match只能从字符串的起始位置进行匹配,而re.search扫描了整个字符串并返回第一个成功的匹配,例如:
其他方面 re.search 与 re.match 一样,可以参照上面的 re.match 来操作。
上面说的两个方法中,我们只能找到一个匹配所写的模式,而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 的结果是一个列表,从中提取需要的标题即可。
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选择器也可以实现搜索文档树的功能
还有一些解析库是使用的是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()