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"]')
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"]')
模糊匹配:
//div[contains(@id, 'first_tag_')]
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("谢谢使用!")