python爬虫正则解析及xpath解析,lxml解析库

正则解析模块re

re模块使用流程

  • 方法一
r_list=re.findall('正则表达式',html,re.S)
  • 方法二
# 1、创建正则编译对象
pattern = re.compile('正则表达式',re.S)  re.S 表示可以匹配换行
r_list = pattern.findall(html)

正则表达式元字符

元字符含义
.任意一个字符(不包括\n)
\d一个数字
\s空白字符
\S非空白字符
[]包含[]内容
*出现0次或多次
+出现1次或多次

匹配任意一个字符的正则表达式

import re
# 方法一
	pattern = re.compile('.', re.S)
# 方法二
	pattern = re.compile('[\s\S]')

贪婪匹配和非贪婪匹配

贪婪匹配

1、在整个表达式匹配成功的前提下,尽可能多的匹配 *
2、表示方式:.*  .+  .?

非贪婪匹配

1、在整个表达式匹配成功的前提下,尽可能少的匹配 *
2、表示方式:.*?  .+?  .??

见示例代码:05_re_greed.py

import re

html = '''
<html>
    <div><p>九霄龙吟惊天变</p></div>
    <div><p>风云际会浅水游</p></div>
<html>
'''

# 贪婪匹配
pattern = re.compile('<div><p>.*</p></div>', re.S)
r_list = pattern.findall(html)
print(r_list)

# 非贪婪匹配
pattern = re.compile('<div><p>(.*?)</p></div>', re.S)
r_list = pattern.findall(html)
print(r_list)

正则表达式分组

作用

在完整的模式中定义子模式,将每个圆括号中子模式匹配出来的结果提取出来

示例

import re

s = 'A B C D'
p1 = re.compile('\w+\s+\w+')
print(p1.findall(s))
# ['A B','C D']
# 分析结果是什么???

p2 = re.compile('(\w+)\s+\w+')
print(p2.findall(s))
# ['A', 'C']
# 分析结果是什么???

p3 = re.compile('(\w+)\s+(\w+)')  # 一旦正则里面有两个或两个以上的分组,就是列表套元组
print(p3.findall(s))
# ['A B','C D']
# [('A', 'B'),('C', 'D')]
# 分析结果是什么???

分组总结

1、在网页中,想要什么内容,就加()
2、先按整体正则匹配,然后再提取分组()中的内容
   如果有2个及以上分组(),则结果中以元组形式显示 [(),(),()]

xpath解析

  • 定义
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言,同样适用于HTML文档的检索
  • 示例HTML代码
<ul class="book_list">
    <li>
        <title class="book_001">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>69.99</price>
    </li>

    <li>
        <title class="book_002">Spider</title>
        <author>Forever</author>
        <year>2019</year>
        <price>49.99</price>
    </li>
</ul>
  • 匹配演示
1、查找所有的li节点
   //li
2、查找li节点下的title子节点中,class属性值为'book_001'的节点
   //li/title[@class="book_001"]
3、查找li节点下所有title节点的,class属性的值
   //li//title/@class

# 只要涉及到条件,加 []
# 只要获取属性值,加 @
  • 选取节点
1// :从所有节点中查找(包括子节点和后代节点)
2、@  :获取属性值
   # 使用场景1(属性值作为条件)
     //div[@class="movie"]
   # 使用场景2(直接获取属性值)
     //div/a/@src
  • 匹配多路径(或)
xpath表达式1 | xpath表达式2 | xpath表达式3  可以针对那些class不一样的进行查找
  • 常用函数
1、contains() :匹配属性值中包含某些字符串节点
   # 查找class属性值中包含"book_"的title节点
     //title[contains(@class,"book_")]
     //div[contains(@class,'article block untagged mb15')]
2、text() :获取节点的文本内容
   # 查找所有书籍的名称
     //ul[@class="book_list"]/li/title/text()

练习

1.获取猫眼电影中的电影信息的dd节点
//dl[@class='board-wrapper']/dd
2.获取电影名称的xpath
//dl[@class='board-wrapper']/dd//p/a
3.获取电影主演的xpath
//dl[@class='board-wrapper']/dd//p[@class='star']/text()
4.获取上映时间的xpath
//dl[@class='board-wrapper']/dd//p[@class='releasetime']/text()

lxml解析库

  • 安装
sudo pip3 install lxml
  • 使用流程
1、导模块
   from lxml import etree
2、创建解析对象
   parse_html = etree.HTML(html)
3、解析对象调用xpath
   r_list = parse_html.xpath('xpath表达式')  # 结果一定是列表
  • 练习
from lxml import etree

html = '''<div class="wrapper">
	<i class="iconfont icon-back" id="back"></i>
	<a href="/" id="channel">新浪社会</a>
	<ul id="nav">
		<li><a href="http://domestic.firefox.sina.com/" title="国内">国内</a></li>
		<li><a href="http://world.firefox.sina.com/" title="国际">国际</a></li>
		<li><a href="http://mil.firefox.sina.com/" title="军事">军事</a></li>
		<li><a href="http://photo.firefox.sina.com/" title="图片">图片</a></li>
		<li><a href="http://society.firefox.sina.com/" title="社会">社会</a></li>
		<li><a href="http://ent.firefox.sina.com/" title="娱乐">娱乐</a></li>
		<li><a href="http://tech.firefox.sina.com/" title="科技">科技</a></li>
		<li><a href="http://sports.firefox.sina.com/" title="体育">体育</a></li>
		<li><a href="http://finance.firefox.sina.com/" title="财经">财经</a></li>
		<li><a href="http://auto.firefox.sina.com/" title="汽车">汽车</a></li>
	</ul>
	<i class="iconfont icon-liebiao" id="menu"></i>
</div>'''
# 创建解析对象
parseHtml = etree.HTML(html)
# 调用xpath返回结束,text()为文本内容
# 提取所有的a的内容
rList = parseHtml.xpath('//a/text()')
#print(rList)

# 提取所有的href的属性值
r2 = parseHtml.xpath('//a/@href')
#print(r2)

# 提取所有href的值,不包括 / 
r3 = parseHtml.xpath('//ul[@id="nav"]/li/a/@href')
#print(r3)

# 获取 图片、军事、...,不包括新浪社会
r4 = parseHtml.xpath('//ul[@id="nav"]/li/a/text()')
for r in r4:
    print(r)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值