Python中使用正则表达式需要先import提取信息的常用方法
优采云 发布时间: 2021-05-11 18:00Python中使用正则表达式需要先import提取信息的常用方法
前言
获取网页信息后,经常需要提取原创信息以获取所需数据。提取信息的方式主要有以下几种:正则表达式,XPath和BeautifulSoup。该博客主要概述了这三种方法的基本语法,并提供了一些示例来说明如何使用这两种方法。
正则表达式
什么是正则表达式?
正则表达式使用某种预定义的模式来匹配具有共同特征的字符串类型。它主要用于处理字符串,可以快速而准确地完成复杂的搜索和替换要求。
在Python中,re模块提供了正则表达式操作所需的功能。因此,要在Python中使用正则表达式,您需要先导入re。
使用正则表达式提取信息可以概括为以下三个步骤(对于大多数提取信息的方法也是如此):
正则表达式的基本符号
在这里,我们主要介绍常规规则中的基本符号。高级语法部分将随附一个链接,供您参考和学习。
RE模块的常用方法
在使用re模块时,请记住先导入import re
重新匹配方法
match(pattern,string [,flags]):
尝试从字符串开头进行匹配,如果匹配成功,则将返回匹配的对象,如果匹配失败,则将不返回任何对象
然后您可以使用group(num)或groups()匹配对象函数来获取匹配表达式
>>> import re
>>> print(re.match('www', 'www.cnblog.com'))
>>> print(re.match('com', 'www.cnblog.com'))
None
>>> line = 'Who are you ?.'
>>> macth = re.match(r'(.*) are (.*?) ', line)
>>> macth.group()
'Who are you '
>>> macth.groups()
('Who', 'you')
>>> macth.group(1)
'Who'
>>> macth.group(2)
'you'
re.search方法
search(pattern,string [,flags]):
扫描整个字符串并返回第一个成功的匹配项。如果匹配成功,则返回匹配的对象,否则返回None。
>>> print(re.search('www', 'www.cnblog.com'))
>>> print(re.search('cn', 'www.cnblog.com'))
re.findAll方法
findall(pattern,string [,flags]):
在字符串中查找与正则表达式匹配的所有子字符串,然后返回列表。如果找不到匹配项,则返回一个空列表。
>>> line = 'cnblog->123sakuraone456'
>>> print(re.findall(r'\d', line))
['1', '2', '3', '4', '5', '6']
>>> print(re.findall(r'\d+', line))
['123', '456']
>>> print(re.findall(r'\D+', line))
['cnblog->', 'sakuraone']
re.split方法
split(pattern,string [,maxsplit = 0]):
根据可以匹配的子字符串拆分字符串,然后返回列表。 maxsplit指定分割数。如果没有匹配项,它将不会被分割。
>>> line = 'www.cnblog.com'
>>> print(re.split(r'\W+', line))
['www', 'cnblog', 'com']
>>> print(re.split(r'\W+', line, 2))
['www', 'cnblog', 'com']
>>> print(re.split(r'\W+', line, 1))
['www', 'cnblog.com']
>>> print(re.split(r'\d+', line, 1))
['www.cnblog.com']
re.sub方法
sub(pattern,repl,string [,count = 0]):
用repl替换字符串中模式的所有匹配项
line = "wodfj1234djsig808"
print(re.sub(r'\D','',line))
1234808
使用XParh
构造正确的正则表达式以使用正则表达式获取复杂文档结构中的内容可能需要花费大量时间。此时,我们可能需要以其他方式提取。
XPath使用路径表达式来选择XML文档中的节点或节点集。这些路径表达式与我们在常规计算机文件系统中看到的非常相似。要获取节点,您需要构建其路径。
主要在Python中,要使用XPath,您需要安装第三方库lxml。
节点类型
由于XPath依赖于路径来选择节点,因此我们首先需要了解XPath中的节点类型:
Harry Potter
J K. Rowling
2005
29.99
(文档节点)
J K. Rowling (元素节点)
lang="en" (属性节点)
节点之间的关系
XML文档被视为节点树,节点之间的关系如下
使用路径表达式选择节点表达式描述示例示例描述
节点名
选择节点名称节点的所有子节点
/
从根节点中选择
xpath('/ div')
从根节点中选择div节点
//
选择所有当前节点,无论它们位于何处
xpath('// div')
选择所有div节点
。
选择当前节点
xpath('./ div')
选择当前节点下的div节点
..
选择当前节点的父节点
xpath('..')
返回上一个节点
@
选择属性
xpath(‘// @ calss’)
选择所有类属性
XPath谓词找到特定节点
该谓词嵌入方括号中以查找特定节点。
表达结果
xpath(‘/ body / div [1]’)
选择主体下的第一个div节点
xpath(‘/ body / div [last()]’)
选择主体下的最后一个div节点
xpath(‘/ body / div [last()-1]’)
选择主体下的倒数第二个div节点
xpath(‘/ body / div [positon()❤️]’)
选择主体下的前两个div节点
xpath(‘/ body / div [@class]’)
在主体下选择具有class属性的div节点
xpath(‘/ body / div [@ class =‘main’]’)
选择其class属性为body为主的div节点
xpath(‘/ body / div [price> 3 5. 00]’)
选择主体下价格元素大于35的div节点
XPath通配符通配符描述示例示例描述
*
匹配任何元素节点
xpath(‘/ div / *’)
选择div下的所有子节点
@ *
匹配任何属性节点
xpath(‘/ div [@ *]’)
选择所有具有属性的div节点
选择多个路径的节点
使用|操作员选择多个路径
表达结果
xpath('// div丨// table')
选择所有div和表节点
//书/标题丨//书/价格
选择book元素的所有书名和价格元素
/书店/书/书名丨//价格
选择属于bookstore元素的book元素的所有title元素以及文档中的所有price元素
将函数功能用于模糊搜索函数的使用说明
开始于
xpath(‘// div [starts-with(@ id,‘ma’)]’)
选择其id值以ma开头的div节点
收录
xpath(‘// div [收录(@id,'ma')]')
选择其id值收录ma的div节点
和
xpath(‘// div [收录(@id,'ma')并收录(@id,“ in”)]')
选择其id值收录ma和in的div节点
text()
xpath(‘// div [contains(text(),‘ma’)]’)
选择其节点文本收录ma的div节点
获取节点的文本内容和属性值
有很多方法可以得到前面提到的节点,所有这些都是为了最终获得所需的文本数据。在XPath中,使用text()获取节点的文本信息,并使用@attribute获取节点的属性值。
from lxml import etree
import requests
html = requests.get('https://movie.douban.com/top250').content.decode('utf8')
print(html)
selector = etree.HTML(html)
title = selector.xpath('//div[@id="content"]/h1/text()')
print(title) # ['豆瓣电影 Top 250']
link = selector.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/@href')
print(link) # ['https://movie.douban.com/subject/1292052/']
如上图所示,我们用于获取节点的文本信息和节点的属性值。为了方便我们使用XPath,请在浏览器的开发人员模式下,选择节点,然后单击鼠标右键以复制所需的路径。但是,这种路径有时不是我们想要的,因为只能获取当前节点,因此我们需要更频繁地构造xpath路径。
使用BeautifulSoup
BeautifulSoup4(BS 4)是Python的第三方库,用于从HTML和XML提取数据。在某些方面,BeautifulSoup4比XPath更易于理解,但不如XPath简洁,并且因为它是开发的使用Python,因此速度比XPath慢。
使用Beautiful Soup4提取HTML内容,通常必须执行以下两个步骤:
处理源代码以生成BeautifulSoup对象
soup = BeautifulSoup(网页源代码, ‘解析器’)
解析器可以使用html.parser或lxml
使用find_all(),find()并选择经常查找内容
import requests
from bs4 import BeautifulSoup
html = requests.get('https://movie.douban.com/top250').content.decode('utf8')
print(html)
soup = BeautifulSoup(html, 'lxml')
title = soup.select('#content > h1')[0].text
print(title) # 豆瓣电影 Top 250
print(soup.find('h1').text) # 豆瓣电影 Top 250
link = soup.select('#content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a')[0].get('href')
print(link) # https://movie.douban.com/subject/1292052/
您可以参阅文档以了解BeautifulSoup库的使用,并将链接附加到中文文档:
摘要
花了一半的时间来整理如何提取信息。其中,对我来说最麻烦的是正则表达式。我已经学过几次正则表达式,但是当我需要使用正则表达式时,仍然需要阅读手册。也许这是一个反复的过程。以下是这三种方法的一些参考学习链接:
正则表达式:
XPath:
BeautifulSoup: