python lxml包学习笔记

2024-03-16 20:48
文章标签 python 学习 笔记 lxml

本文主要是介绍python lxml包学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python lxml包用于解析XML和html文件,可以使用xpath和css定位元素,个人认为相对于BeautifulSoup功能更加强大,更加灵活。本文根据lxml官方文档和自己的理解列出常用的函数, 本文代码为python3.4, lxml2.0

lxml:http://lxml.de/

支持:python2 python3

解析XML, 以pubmed文献数据库文本解析为例

导入xml字符串

导入xml字符串有多种方式,我最长使用的是 lxml.etree.XML(xml字符串), etree.fromstring(xml字符串)也可以

import lxml.etree 
import urllib.request
from lxml.etree import *
str_url = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=26693255&retmode=text&rettype=xml'
request = urllib.request.Request(str_url)
xml_text = urllib.request.urlopen(request).read()
root = lxml.etree.XML(xml_text) # xml_text 为xml纯文本文件

root 为lxml.etree._Element 对象,含有多个函数

root 含有find,findall, xpath,get,getchildren函数, 重点请help(root)

### findall, find
findall(…)
| findall(self, path, namespaces=None)
|
| Finds all matching subelements, by tag name or path.
| 输入下一级对象的tag标签或xpath(必须是相对路径.//开头),返回匹配结果的所有元素,是一个list
| The optional namespaces argument accepts a
| prefix-to-namespace mapping that allows the usage of XPath
| prefixes in the path expression.

find(…)
| find(self, path, namespaces=None)
|
| Finds the first matching subelement, by tag name or path.
| 输入下一级的tag标签或xpath,返回匹配结果的第一个元素
| The optional namespaces argument accepts a
| prefix-to-namespace mapping that allows the usage of XPath
| prefixes in the path expression.

# example  获取杂志名称和ISSN
# 使用 tag作为输入需要逐级进行
journal_name = root.find('PubmedArticle').find('MedlineCitation').find('Article').find('Journal').find('Title').text
print('tag:', journal_name)
tag: Cognitive computation
# 也可以使用xpath(必须使用相对路径,以.//开头,如果想使用绝对路径可以使用xpath函数)
journal_name = root.find('.//Title').text
print('xpath:' ,journal_name)
xpath: Cognitive computation
# text是element对象的属性,可以得到内部的内容,如果要得到标签内部的属性
#使用get函数
# 比如得到 <ISSN IssnType="Print">1866-9956</ISSN>的 IssnTYpe属性,则可以使用get函数
issn_attr = root.find('.//ISSN').get('IssnType')
print('issn attr:', issn_attr)
issn attr: Print
# 使用tostring函数
# 可以得到改标签下的全部内容,tostring函数是 lxml.etree 下的静态函数,使用前需要 from lxml.etree import *
tostring(root.find('.//JournalIssue')) # 得到JournalIssue标签下的全部内容
b'<JournalIssue CitedMedium="Print">\n                    <Volume>7</Volume>\n                    <Issue>6</Issue>\n                    <PubDate>\n                        <MedlineDate>2015</MedlineDate>\n                    </PubDate>\n                </JournalIssue>\n                '

findall函数与find函数类似,find相当于findall(‘tag’)[0]

xpath 函数

具体xpath的学习可以参考 http://www.w3school.com.cn/xpath/xpath_syntax.asp
xpath与findall类似也返回一个list,不同之处是只能使用xpath,而且可以使用xpath的相对路径和绝对路径

journal_name = root.xpath('//Title')[0].text
print(journal_name)
Cognitive computation

getchildren函数

得到所有直接子元素

注意,使用findall,find,xpath时一定要确定元素是否存在(可以用 if 判断),然后才读取text属性,否则会遇到 Type ‘NoneType’ cannot be serialized., list index out of range, ‘NoneType’ object has no attribute ‘text’这样的错误。

除了上述读取的函数,lxml还包含了很多设置的函数,功能强大,具体可以去看lxml官方文档

lxml 解析 html 以爬取 豆瓣电影主页本周口碑榜

http://movie.douban.com/

导入html字符串,使用 lxml.html.fromstring(html_text)

import lxml.html
str_url = 'http://movie.douban.com/'
request = urllib.request.Request(str_url)
html_text = urllib.request.urlopen(request).read()
root = lxml.html.fromstring(html_text)

依旧可以使用find,findall函数,用法与XML部分完全相同,可以使用下一级的tag和xpath作为输出,此处不再赘述

cssselect() 函数,返回list,包含所有匹配的结果,可以使用css选择器,类似于jquery

# 获取本页面所有项目名称
movies_list = [a.text for a in  root.cssselect('div.billboard-bd tr td a')]
print(movies_list)
['老炮儿', '八恶人', '卡罗尔', '海街日记', '荒野猎人', '寻龙诀', '丹麦女孩', '龙虾', '边境杀手', '实习生']
# 获取所有电影超链接
movies_href = [a.get('href') for a in  root.cssselect('div.billboard-bd tr td a')]
print(movies_href)
['http://movie.douban.com/subject/24751756/', 'http://movie.douban.com/subject/25787888/', 'http://movie.douban.com/subject/10757577/', 'http://movie.douban.com/subject/25895901/', 'http://movie.douban.com/subject/5327268/', 'http://movie.douban.com/subject/3077412/', 'http://movie.douban.com/subject/3071604/', 'http://movie.douban.com/subject/20514947/', 'http://movie.douban.com/subject/25881247/', 'http://movie.douban.com/subject/10594965/']

其他函数

text_content() 可以返回改element下的所有文本(去除所有<>标签)

.make_links_absolute(base_href, resolve_base_href=True) 有时候遇到的链接是相对路径,可以使用该函数将相对路径转换为绝对路径

.rewrite_links(link_repl_func, resolve_base_href=True, base_href=None)根据替换函数替换链接

这篇关于python lxml包学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816677

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主