爬虫页面解析 lxml 简单教程

一、与字符串的相互转换

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

原文地址:https://www.cnblogs.com/qiu-hua/p/12731286.html