15天学会爬虫 第四天

爬虫

第四天

正则表达式

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

  • / 表示根路径或者节点之间的过度
  • // 从任意位置开始查找所有的指定标签
    1. //a 查找文档中所有的a标签
    2. /li//a 找根节点下面的li标签下面的所有a标签, ali后代节点
    3. //li/a 查找所有的li下的a标签,ali子节点
  • @attr获取标签的指定属性值
    1. //a/@href 获取所有a标签的href
    2. /li//img/@src获取根节点下面的li标签下面的img标签的src属性值
    3. /html/head/link/@href
  • text()获取标签的文本内容
    1. //a/text()获取所有a标签的文本值
    2. //li//text()获取所有li标签下所有的文本内容
  • xpath定位
    1. //a[@class='bt']所有a标签中class属性值为bt的
    2. //a[text()='下一页']/@herf 找文本为下一页的a标签的href属性值
    3. //a[1] 第一个
    4. //a[last()]最后一个
    5. //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)

数据提取的通用方式:先分组,再提取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章