前言

正则表达来提取所需要的数据的好处就在于其灵活性,可以给我们的爬虫带来很大的方便,但是其不足就是表达式很难写,需要花费一些心思去处理,需要构造出可以正确匹配我们需要的正则表达式,正则表达的符号平时对照着表来看就可以了

正则符号具体介绍和使用方法如下:




lua正则提取多个 正则提取url_正则


lua正则提取多个 正则提取url_html_02


lua正则提取多个 正则提取url_正则表达式_03


lua正则提取多个 正则提取url_html_04


lua正则提取多个 正则提取url_html_05


正则爬取小说内容

目标

目标地址:

https://www.qu.la/book/390/www.qu.la


lua正则提取多个 正则提取url_正则表达式_06


然后我们需要爬下它的title

分析

我们先查看他的源码如下:


lua正则提取多个 正则提取url_html_07


可以看到结构体系还是蛮规范的,那么爬的方法就很多了,这里主要采用正则提取方法,目的在于介绍正则表达式,比如我们需要爬的内容如下:


lua正则提取多个 正则提取url_lua正则提取多个_08


我们提取链接的数据信息进行分析:

<dd> <astyle=""href="/book/390/293630.html">第四十六章 暴怒的萧炎</a></dd>
<dd> <astyle=""href="/book/390/293632.html">第四十八章 斗气阁</a></dd>

也就是说我们的提取章节的信息存储在元素中的text文本中,不同的内容就是链接的根文件名,所以我们可以大致构造出正则表达:

'<dd> <a style="" href="/book/390/d+.html">(.*?)</a></dd>'

具体介绍如下:

d+:d 匹配一个数字,+ 匹配多个数字

.*?:匹配尽可能多的满足的字符,也叫贪婪匹配,其中.表示匹配单个字符 ,?匹配0次或1次,*表示匹配0次到n次

():匹配返回,小括号表示匹配括号中全部字符,如果在正则表达式中加上这个,那符合结果的会返回, d+ 没有括号,因为我们不需要那些数字,.*? 这个匹配的是标题,我们需要所以加上括号返回

请求网页

常规的requests请求,不多阐述,代码如下:

def get_html(url):
 '''
 请求 html
 :return:
 '''
 headers = {
 'User-Agent' : UserAgent().random
 }
 response = requests.get(url,headers=headers)
 if response.status_code == 200:
 response.encoding = 'utf-8'
 return response.text
 else:
 return

分析数据

根据我们再4.2.2种写的正则表达式:

R= '<dd> <a style="" href="/book/390/d+.html">(.*?)</a></dd>'
titles = re.findall(r,html,re.S)

我们使用 findall 方法

r:正则表达式

html:网页源码,指的是请求网页返回的html

re.S:是一种匹配的模式,是指允许换行匹配,因为在构造正则时,网页源码可能换行了就需要它,返回的是一个列表,包含了在此 html 源码中匹配的符合的结果

代码如下:

def get_info(html):
 '''
 提取文章标题
 :param html:
 :return:
 '''
 pat = '<dd> <a style="" href="/book/390/d+.html">(.*?)</a></dd>'
 titles = re.findall(pat,html,re.S)
 for title in titles:
 print(title)

小结

因为提取的内容都是比较规范的结构,所以很多复杂的情况不需要去考虑,类似中间有垃圾数据干扰我们的爬虫我们又该如何去处理,这个问题会接下来进行具体介绍,这里就先附上正则入门实例的源码:

完整代码如下:

import requests
import re
from fake_useragent import UserAgent
def get_html(url):
 '''
 请求 html
 :return:
 '''
 headers = {
 'User-Agent' : UserAgent().random
 }
 response = requests.get(url,headers=headers)
 if response.status_code == 200:
 response.encoding = 'utf-8'
 return response.text
 else:
 return
def get_info(html):
 '''
 提取文章标题
 :param html:
 :return:
 '''
 pat = '<dd> <a style="" href=" ">(.*?)</ a></dd>'
 titles = re.findall(pat,html,re.S)
 for title in titles:
 print(title)
if __name__ == '__main__':
 '''
 主接口
 '''
 url = 'https://www.qu.la/book/390/'
 html = get_html(url)
 if html == None:
 print('请求失败!')
 get_info(html)

欢迎大家加入人工智能圈参与交流

人工智能学习圈 - 知乎www.zhihu.com

lua正则提取多个 正则提取url_html_09