版权声明:转载请附带我的链接,谢谢! https://blog.csdn.net/weixin_41950282/article/details/86372599
爬虫
第四天
正则表达式
1.1 单个字符
\d
数字0-9\s
空白字符 空格\t
\n
\w
单词字符.
除了\n
的任意字符- [a-d0-9] 匹配a-d或者0-9中任意一个
1.2 多个字符
- {m,n}前一个字符出现m-n次(包含m和n)
*
匹配前一个字符任意次(0,1,多次)+
匹配前一个字符至少一次(1或者多次)?
匹配前一个字符0次或1次
1.3 re模块
- re.findall() # 查找所有
- re.sub() # 替换,数据清洗的时候很常用
- re.compile() # 先编译后匹配,提高匹配效率
re.findall(“regex”),如果正则表达式进行了分组,需要考虑返回的数据情况
- 一个分组,返回包含字符串的列表
- 多个分组,返回包含元组的列表,元组内是多个分组匹配到的字符串
r的用途
忽略转义符号\
带来的影响,为了表示原字符本身的话,直接在正则表达式前面加上r
即可
Windows下的文件路径需要加上r
xpath
/
表示根路径或者节点之间的过度//
从任意位置开始查找所有的指定标签//a
查找文档中所有的a标签/li//a
找根节点下面的li
标签下面的所有a
标签,a
是li
的后代节点
//li/a
查找所有的li
下的a
标签,a
是li
的子节点
@attr
获取标签的指定属性值//a/@href
获取所有a
标签的href
值/li//img/@src
获取根节点下面的li
标签下面的img
标签的src
属性值/html/head/link/@href
text()
获取标签的文本内容//a/text()
获取所有a
标签的文本值//li//text()
获取所有li
标签下所有的文本内容
- xpath定位
//a[@class='bt']
所有a标签中class属性值为bt的//a[text()='下一页']/@herf
找文本为下一页的a标签的href属性值//a[1]
第一个//a[last()]
最后一个//a[postions()<3]
前2个
4. lxml模块的使用
pip install lxml
from lxml import etree
text = '''<html> <div> <ul>
<li class="item-1"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul> </div> '''
# 将网页内容加载,返回一个Element对象,具有xpath方法
el = etree.HTML(text)
# 将element对象还原为网页数据的字符串
print(etree.tostring(el).decode())
# xpath表达式如果是定位标签,返回的结果是一个以element为元素的列表
li_list = el.xpath("//li[@class='item-1']")
print(li_list)
# 建议这样写
li_list[0].xpath("./a/@href")
# 不建议这样写
li_list[0].xpath("a/@href")
# xpath表达式如果是获取属性值或者文本。返回的结果是一个以字符串为元素的列表
href_list = el.xpath("//li[@class='item-1']/a/text()")
print(href_list)
数据提取的通用方式:先分组,再提取