一、与字符串的相互转换

1.字符串转变为etree 对象

import lxml.html
tree = lxml.html.fromstring(content) # content 字符串对象

2.etree对象转变为字符串

from lxml import etree
content = etree.tostring(tree,encoding='utf-8')
data = content.decode('utf-8')

二、元素增删改

1.查看元素

etree._Element 是一个设计很精妙的结构,可以把他当做一个对象访问当前节点自身的文本节点,可以把他当做一个数组,元素就是他的子节点,可以把它当做一个字典,从而遍历他的属性

>>> root.text
'root content' # 注意只是 root 自身的文本,并不包含子节点的文本
>>> root.tag # 标签
'root'
>>> root[0].tag # root 的第一个子元素的标签
'foo'
>>> foo = root[0] # root 的第一个子元素
>>> for attr, val in foo.items():
... print(attr, val)
...
id foo-id
class foo zoo
>>> foo.get('id') # 获取foo的id的属性值
'foo-id'
>>> foo.attrib # 获取foo的所有属性以及属性值
{'class': 'foo zoo', 'id': 'foo-id'}

2.增加元素

找到要插入的位置,然后再插入,例如作为某个元素的子节点插入

import etree
root = etree.Element("root") # 找到root元素
root.append( etree.Element("child1") ) # 作为root的子元素插入
child2 = etree.SubElement(root, "child2") # 作为root的子元素插入
child3 = etree.SubElement(root, "child3") # 作为root的子元素插入

3.修改元素

增加属性

root['name'] = "root"

修改属性

root['name'] = "new_root"

.set(key, value=None):

root.set('name', "root"):

删除属性 

strip_attributes(tree_or_element, *attribute_names)

strip_attributes(root, 'root')

修改元素文本值

root.text = "new_text"

4.删除元素

通过tag标签删除 strip_elements(tree_or_element, with_tail=True, *tag_names)

删除某一元素:找到其父节点,通过父节点删除子节点的方式删除

parent = node.getparent()
parent.remove(node)

删除元素的子节点

root.clear()

三、元素的父,子,同胞节点查找

1.元素的父节点 

root.getparent()

2.元素的子节点

root.getchildren()

3.元素的同胞节点

获取上一个位置同胞  el.getprevious()

获取下一个位置同胞  el.getnext()

4.获取etree的根节点 tree.getroot()

5 iter

.iterchildren() Element.iterchildren() iterates over the children of an element in either direction
.itersiblings()  Element.itersiblings() iterates over either the following or preceding siblings of an element
.iterancestors()  Element.iterancestors() iterates over the ancestors of an element (from parent to parent)

.iterdescendants() Element.iterdescendants() iterates over the descendants of an element

四、元素查询xpath路径选择器

1.根据元素属性

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
# 根据属性值模糊匹配
//a[contains(@class, “”)]

2.根据元素文本

# 等于值
//a[text()="文本"]
# 模糊匹配
//a[contains(text(),"文本")]

3.利用xpath轴

轴可定义相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
following-sibling 选取当前节点之后的所有兄弟节点
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

具体使用方法示例为:parent::div,即轴名称::标签名

parent 选取当前节点的父节点,也就是当前节点上一级节点
示例://div[contains(text(),'产证地址')]/parent::td
前半段//div[contains(text(),'产证地址')]为找到内容包含产证地址的div节点然后它的上一级节点 parent::td,

参考 https://www.jianshu.com/p/fcfc889aba43

五、重要的函数附表

https://www.runoob.com/xpath/xpath-tutorial.html

爬虫页面解析 lxml 简单教程的更多相关文章

  1. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  2. php爬虫最最最最简单教程

    php爬虫最最最最简单教程 一.总结 一句话总结:用的爬虫框架,却是用的自己的例子(因为网站结构的变化,作者的例子不一定好用) 爬虫框架 自己例子 1.发现自己的运行效果和作者的不一样怎么办? 耐下性 ...

  3. 【XPath Helper:chrome爬虫网页解析工具 Chrome插件】XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插件网

    [XPath Helper:chrome爬虫网页解析工具 Chrome插件]XPath Helper:chrome爬虫网页解析工具 Chrome插件下载_教程_安装 - 开发者插件 - Chrome插 ...

  4. python爬虫网页解析之lxml模块

    08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...

  5. 爬虫---lxml简单操作

    前几篇写了一些Beautiful Soup的一些简单操作,也拿出来了一些实例进行实践,今天引入一个新的python库lxmt,lxmt也可以完成数据的爬取哦 什么是lxml lxml是python的一 ...

  6. python爬虫数据解析之BeautifulSoup

    BeautifulSoup是一个可以从HTML或者XML文件中提取数据的python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. BeautfulSoup是python爬虫三 ...

  7. python爬虫之解析库Beautiful Soup

    为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个 ...

  8. springmvc简单教程

    IDEA建立Spring MVC Hello World 详细入门教程(转自)   引子,其实从.NET转Java已经有几个月时间了,项目也做了不少,但是很多配置都是根据公司模板或者网上教程比忽略画瓢 ...

  9. ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...

随机推荐

  1. Proving Equivalences(缩点+有环图变强连通分量)【tarjian算法】

    Proving Equivalences 题目链接(点击) 参考博客(点击) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768 ...

  2. Python爬虫小白入门(七)爬取豆瓣音乐top250

      抓取目标: 豆瓣音乐top250的歌名.作者(专辑).评分和歌曲链接 使用工具: requests + lxml + xpath. 我认为这种工具组合是最适合初学者的,requests比pytho ...

  3. 恕我直言你可能真的不会java第2篇:Java Stream API?

    一.什么是Java Stream API? Java Stream函数式编程接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑式的功能特性,它极大的方便了开放人员处理集合 ...

  4. C#数据结构与算法系列(八):栈(Stack)

    1.介绍 栈是一个先入后出(FILO-First In Last Out)的有序列表 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表.允许插入和删除的一端,为变化的一端,称为栈顶 ...

  5. cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort

    cb49a_c++_STL_算法_对所有元素排序_sort_stable_sort sort(b,e) sort(b,e,p) stable_sort(b,e) stable_sort(b,e,p) ...

  6. arduino连接1602LCD方法

    arduino连接1602LCD方法 参考代码:

  7. cron计划任务

    格式 crontab -e [-u 用户名] ##编辑:注意,每项工作都是一行. crontab -l [-u 用户名] ##查看 crontab -r [-u 用户名] #清除 分 时 日 月 周 ...

  8. CentOS快速安装Nginx的方法,nginx如何启动重启停止

    1.防止 make: command not found,提前安装一些插件,取决于当前环境是否已安装,如果已经安装就不需要执行此命令 yum -y install gcc automake autoc ...

  9. 电商安全无小事,如何有效抵御 CSRF 攻击?

    现在,我们绝大多数人都会在网上购物买东西.但是很多人都不清楚的是,很多电商网站会存在安全漏洞.乌云就通报过,国内很多家公司的网站都存在 CSRF 漏洞.如果某个网站存在这种安全漏洞的话,那么我们在购物 ...

  10. 四层发现-TCP和UDP发现简介

    虽然这里使用到了端口发现,但是四层发现阶段并不对端口进行解析,而是通过端口进行对ip是否存活的判断. 这里是对主机的发现,而不是对端口的识别. 四层发现的结果比三层发现的结果更加精确,基本不会被防火墙 ...