1. 直接使用正则re模块的方法
1.1 Re模块直接使用的一些常用方法主要有:
match 方法:从起始位置开始查找,也可以设置从某个位置开始匹配,一次匹配
search 方法:从任何位置开始查找,也可以设置从某个位置开始匹配,一次匹配
findall 方法:全部匹配,也可以设置从某个位置开始匹配,返回列表
finditer 方法:全部匹配,也可以设置从某个位置开始匹配,返回迭代器
split 方法:分割字符串,返回列表
sub 方法:替换,替换多少个字符串
1.2 使用compile 函数后的方法
1)使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
2)通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。
3)最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作
4)re.S和re.I
re.I:忽略大小写
re.S:全文匹配
import re content = "hello world python and python" #正则表达式:r"python" #内容:"hello world python and python " pattern = re.compile(r"python") #从6位置开始匹配到末尾,匹配成功一个后返回 ret = pattern.match(content,12,len(content)) print(ret)
2. 什么是XML?
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
2.1 lxml库--解析和提取 HTML/XML 数据
lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。
lxml python 官方文档:http://lxml.de/index.html
2.2 基本用法
from lxml import etree html = etree.parse('./hello.html') # 显示etree.parse() 返回类型 # 获取所有的 <li> 标签 result = html.xpath('//li') # 获取<li> 标签的所有 class属性 result = html.xpath('//li/@class') # 继续获取<li>标签下hre f为 link1.html 的 <a>标签 result = html.xpath('//li/a[@href="link1.html"]') # 获取<li> 标签下的所有 <span> 标签 result = html.xpath('//li//span') # 获取 <li> 标签下的<a>标签里的所有 class li_lists = html.xpath("//li/a//@class") # 获取最后一个 <li> 的 <a> 的 href li_lists = html.xpath('//li[last()]/a/@href') # 获取倒数第二个元素li的内容 li_lists = html.xpath('//li[last()-1]/a/text()') # 获取 class 值为 bold 的标签名 li_lists = html.xpath('//*[@class="bold"]')
3. 使用xpath得到百度贴吧帖子里面的图片
from urllib import parse from urllib.request import urlopen,Request from lxml import etree image_name = 1 #请求网络,返回某个主页html代码 def load_page(full_url,file_name): print("正在下载:%s" % file_name) #去百度贴吧请求的时候添加请求头的信息和没有添加返回有区别,不要添加请求头 request = Request(full_url) # 打开连接 response = urlopen(request) #返回数据 return response.read() #得到贴吧的某页的所以帖子的链接,并且返回 def get_tiebar_urls(html,page): print("正在使用xpath得到[%s]页的帖子链接...." % page) content = etree.HTML(html) tiebar_urls = content.xpath('//div[@class="threadlist_lz clearfix"]/div/a[@rel="noreferrer"]/@href') for tiebar_url in tiebar_urls: tiebar_url = "http://tieba.baidu.com"+tiebar_url # print(tiebar_url) get_image_urls(tiebar_url) #根据某个帖子,从里面得到所以图片的链接 def get_image_urls(tieba_url): request = Request(tieba_url) # 打开连接 response = urlopen(request) # 返回数据 html = response.read() #得到使用lxml转换后的数据 content = etree.HTML(html) image_urls = content.xpath('//div[@class="d_post_content j_d_post_content "]/img/@src') for image_url in image_urls: print(image_url) #组拼1~6页的连接 def tieba_spide(url,start_page,end_page): for page in range(start_page,end_page+1): #每页50条数据:根据数据库分页公式:select * from students where limit (n-1)*m ,m #(n-1)*m是起始数据;m是每页多少条数据 pn = (page-1) * 50 full_url = url+"&pn="+ str(pn) #文件名称 file_name = "第"+str(page) +"页.html" response_data = load_page(full_url,file_name) #得到某个贴吧的帖子的所以链接 get_tiebar_urls(response_data,page) if __name__ == "__main__": kw = input("请输入你要爬取的贴吧名称:") start_page = int(input("请输入起始页:")) end_page = int(input("请输入结束页面:")) kw = {"kw":kw} #转换成url编码 kw = parse.urlencode(kw) url = "https://tieba.baidu.com/f?" url = url + kw # print("url==",url) #组装1~6页的数据 tieba_spide(url,start_page,end_page) print("谢谢使用!")