博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【笔记】python爬虫实战1 lxml模块 xPath语法 实例:爬取豆瓣网站
阅读量:3904 次
发布时间:2019-05-23

本文共 2506 字,大约阅读时间需要 8 分钟。

语法

lxml是python的一个解析库,支持HTML 和XML的解析,支持XPath解析方式而且解析效率非常高

XPath是一门在xml文档中查找信息的语言,最初适用于搜索XML的文档,但也适用于HTML文档的搜索

4-1使用xpath解析字符串

from lxml import etree							#导入lxmltext='''
''' #定义字符串html=etree.HTML(text) #初始化生成一个XPath解析对象result=etree.tostring(html,encoding='utf-8') #解析对象输出代码print(type(html))print(type(result))print(result.decode('utf-8'))

在这里插入图片描述

以上代码调用etree对象的HTML()方法将定义的字符串转化为一个XPath解析对象,之后调用etree对象的tostring()方法解析对象并输出代码
print(type(html)):
<class ‘lxml.etree._Element’>

使用lxml解析html文件

先保存一份text.xml文件:

使用lxml来解析文件:

htmlEmt = etree.parse('text.xml') #用etree的parse()方法解析xml文件result = etree.tostring(htmlEmt,pretty_print=True) #设置优化输出print(result)

在这里插入图片描述

如果不设置pretty_print则输出的结果:
在这里插入图片描述

获取所有的 <\li> 标签 /倒数第x个li标签

from lxml import etreehtmlEmt = etree.parse('text.xml')			# 获取文件元素result = htmlEmt.xpath('//li')				# 获取所有的 
  • 标签 print(result) #输出所有内容print(len(result)) # 获取标签数量print(result[0]) # 取出第一个 li 标签
  • htmlEmt = etree.parse('text.xml') #用etree的parse()方法解析xml文件result = htmlEmt.xpath('//li/@class') #//li/@class表示获取li标签下所有class属性print(result)

    在这里插入图片描述

    ‘//li/a//@class’ 表示获取不包括<li 标签本身的class
    ‘//li[last()]/a/@href’ 表示获取最后一个<li标签的< a>标签的href
    在这里插入图片描述

    实例

    代码:

    import requests										#导入requests模块from lxml import etree								#导入lxmlheaders = {
    "User-Agentv": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3554.0 Safari/537.36", "Referer": "https://movie.douban.com/",} # 请求头设置url = "https://movie.douban.com/cinema/nowplaying/chongqing/" #定义请求URLrep = requests.get(url, headers=headers) #发起请求text = rep.text #返回Unicode型数据html = etree.HTML(text) # 转换成html格式ul = html.xpath("//ul[@class='lists']")[0] # 找到子孙节点ul标签lis = ul.xpath("./li") # 当前ul下的所有li标签movies = [] #空列表for li in lis: # 循环每个li标签 title = li.xpath("@data-title")[0] # 直接@li标签的属性获取值 score = li.xpath("@data-score")[0] region = li.xpath("@data-region")[0] actors = li.xpath("@data-actors")[0] director = li.xpath("@data-director")[0] liimg = li.xpath(".//img/@src") movie = {
    "title": title, "score": score, "region": region, "actors": actors, "director": director, "liimg": liimg, } #字典数据 movies.append(movie) #添加到列表print(movies) #输出结果

    ps:以上的代码运行会报错,暂时没找出解决方法

    在这里插入图片描述

    转载地址:http://utten.baihongyu.com/

    你可能感兴趣的文章
    String深拷贝、比较及增删查改等操作
    查看>>
    智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr
    查看>>
    【C++】智能指针shared_ptr 定位删除器(仿函数)
    查看>>
    浅析c++异常
    查看>>
    判断一个数是否为回文数,字符串是否为回文字符串
    查看>>
    迷宫问题
    查看>>
    使用两个栈实现一个队列
    查看>>
    使用两个队列实现一个栈
    查看>>
    实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
    查看>>
    稀疏矩阵的压缩存储和转置
    查看>>
    堆的实现(堆的建立及push、pop元素)
    查看>>
    【适配器模式】实现优先级队列
    查看>>
    堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)
    查看>>
    【海量数据处理】N个数中找出最大的前K个数
    查看>>
    哈希冲突的处理【闭散列方法-线性探测和二次探测】
    查看>>
    哈希桶处理哈希冲突
    查看>>
    位图(BitMap)&& 布隆过滤器(BloomFilter)
    查看>>
    总结: 笔试中常见virtual函数问题
    查看>>
    vue中使用mock模拟后端数据
    查看>>
    vue中如何实现table的详情页获取及渲染
    查看>>