• xpah的使用


    目录

    基本介绍

    基本使用

    案例


    基本介绍

    为什么要学习xpath

    1. scrapy框架支持xpath提取

    2. selenium 经常使用xpath提取

    3. 使用简洁 语法稍稍复杂

    xpath是什么?

    1. 全称 xml path language

    2. 从xml中提取数据的语言

    3. bs4按照标签名和属性进行查找, xpath 通过路径查找 也可以按照标签名和属性进行查找,通过一个具体的获得数据

    html和lxml和xml:

    1. html 超文本标记语言

    2. xml 可扩展标记语言

    3. lxml python的第三方库 使用lxml下的etree模块把html转化为lxml对象

    4. 转换之后才能进行xpath提取

    怎么使用?

    1. 官方文档 lxml - Processing XML and HTML with Python 英文文档

    2. 浏览器插件 chrome浏览器 xpath helper 直接在网页上就行xpath提取

    基本使用

    1. # 1 安装
    2. # pip install lxml
    3. # 2 导包
    4. # from lxml import etree
    5. # 3 把html文件转为lxml对象
    6. # xml = etree.HTML(网页源代码)
    7. # 4 使用xpath语句进行提取
    8. # xml.xpath(xpath语句)
    1. from lxml import etree
    2. xml_content = '''
    3. aaa
    4. bookstore
    5. Harry Potter
    6. aaa
    7. 333
    8. JK.Rowing
    9. 2005
    10. 29
    11. '''
    12. # 把html转化为lxml对象
    13. # 自动补全
    14. xml = etree.HTML(xml_content)
    15. # print(type(xml))
    16. # / 从根节点进行选取 默认返回列表
    17. title = xml.xpath('/html/body/bookstore/book/title')[0]
    18. # etree.tostring(xml,encoding='utf-8') 把lxml对象转为字符串
    19. # print(etree.tostring(xml,encoding='utf-8'))
    20. # print(etree.tostring(title,encoding='utf-8'))
    21. # // 从当前节点进行选取 不考虑标签的位置
    22. # /text()取出标签内的文本
    23. # print(xml.xpath('//bookstore//title/text()'))
    24. # [@属性名] 查找携带lang属性的title标签
    25. # *代表所有的标签名
    26. # print(xml.xpath('//*[@lang]/text()'))
    27. # print(xml.xpath('//title[@lang]/text()'))
    28. # [@属性名='属性值']
    29. # *可以用于代替属性名
    30. print(xml.xpath('//*[@*="aaa"]/text()'))
    31. # /title[2] 取出第n个title标签
    32. print(xml.xpath('//title[1]/text()'))
    33. # [/text()='xxxx'] 通过文本进行查找
    34. print(xml.xpath('//*[text()="aaa"]/text()'))
    35. # /@属性名 取出属性
    36. print(xml.xpath('//*[text()="bookstore"]/@lang'))
    37. # . 选取当前节点
    38. book = xml.xpath('//book/*')
    39. print(book.xpath('./title[1]/text()'))
    40. # for i in book:
    41. # print(i.xpath('./text()'))

    案例

    1. # https://xiaohua.zol.com.cn/lengxiaohua/
    2. # 需求 爬取标题和正文
    3. from lxml import etree
    4. from fake_useragent import UserAgent
    5. import requests
    6. def download(url):
    7. headers = {
    8. 'user-agent': UserAgent().random
    9. }
    10. html = requests.get(url=url,headers=headers)
    11. return html.text
    12. def get_dat(html):
    13. data_list = []
    14. xml = etree.HTML(html)
    15. # titile_list = xml.xpath('//span[@class="article-title"]/a[@target="_blank"]/text()')
    16. # print(titile_list)
    17. # text_list = xml.xpath('//div[@class="summary-text"]//text()')
    18. # print(text_list)
    19. # 先取大后取小
    20. li_list = xml.xpath('//ul[@class="article-list"]/li')
    21. for li in li_list:
    22. title = li.xpath('.//span[@class="article-title"]/a[@target="_blank"]/text()')
    23. # strip() 去除字符串头尾的空格 \n
    24. # text = li.xpath('.//div[@class="summary-text"]//text()')
    25. # 重点 推导式运用和列表脏数据清理
    26. text = ''.join([i.strip() for i in li.xpath('.//div[@class="summary-text"]//text()')])
    27. print(title)
    28. print(text)
    29. print('-'*100)
    30. return data_list
    31. # 获取下一页的url 没有则返回空
    32. def get_nexturl(html):
    33. xml = etree.HTML(html)
    34. next_url = xml.xpath("//a[text()='下一页']/@href")
    35. if next_url:
    36. return 'https://xiaohua.zol.com.cn/'+next_url[0]
    37. else:
    38. return None
    39. if __name__ == '__main__':
    40. url = 'https://xiaohua.zol.com.cn/lengxiaohua/'
    41. i = 0
    42. while True:
    43. html = download(url)
    44. get_dat(html)
    45. url = get_nexturl(html)
    46. i += 1
    47. print(i)
    48. if not url:
    49. break

  • 相关阅读:
    Unity环境下实现Camera高帧率RTMP推送
    exit(0),exit(1),exit(EXIT_SUCCESS),exit(EXIT_FAILURE)
    Java面试前需要了解的东西
    Mybatis 日志(Apache Commons Logging)
    51单片机单片机基础知识
    分布式ID详解(5种分布式ID生成方案)
    【国漫逆袭】火灵儿重返第一巅峰,云曦排名飙升,不良人陷入颓势
    Matlab图像处理-HSV
    【云原生】灰度发布、蓝绿发布、滚动发布、灰度发布解释
    R语言和医学统计学(13):协方差分析
  • 原文地址:https://blog.csdn.net/qq_51179608/article/details/126653800