博客
关于我
强烈建议你试试无所不能的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/

    你可能感兴趣的文章
    QT打开项目提示no valid settings file could be found
    查看>>
    Win10+VS+ESP32环境搭建
    查看>>
    Ubuntu+win10远程桌面
    查看>>
    flutter-实现圆角带边框的view(android无效)
    查看>>
    flutter-实现一个下拉刷新上拉加载的列表
    查看>>
    android 代码实现圆角
    查看>>
    postman调试webservice接口
    查看>>
    flutter-解析json
    查看>>
    android中shader的使用
    查看>>
    java LinkedList与ArrayList迭代器遍历和for遍历对比
    查看>>
    Android DataBinding使用2-Recycleview
    查看>>
    drat中构造方法
    查看>>
    JavaScript的一些基础-数据类型
    查看>>
    JavaScript基础知识(2)
    查看>>
    转载一个webview开车指南以及实际项目中的使用
    查看>>
    关于activity保存页面状态的两个方法
    查看>>
    android中对于非属性动画的整理
    查看>>
    一个简单的TabLayout的使用
    查看>>
    关于let{a}=B出现的解构赋值
    查看>>
    ReactNative使用Redux例子
    查看>>