xpath语法和lxml库

xpath语法和lxml库

    • XPath语法
        • 选取节点
        • 谓语
        • 通配符
        • 运算符
        • 扩展
    • lxml库

XPath语法

选取节点

表达式 描述 示例 结果
nodename 选取子节点的所有节点 bookstore 选取bookstore下的所有节点
/ 如果在最前面代表从根节点选取。否则选取某节点下的某节点 /bookstore 选取根元素下的所有bookstore节点
// 从全局节点中选择节点,随便在哪个位置 //book 从全局节点中找到所有的bookstore节点
@ 选取某个节点的属性 //book [ @price ] 选择所有book节点下的price属性

谓语

角标从1开始

路径表达式 描述
/bookstore/book[1] 选取bookstore下的第一个子元素
/bookstore/book[last()] 选取bookstore下的最后一个子元素
/bookstore/book[position() < 3] 选取bookstore下的前两个子元素
/bookstore/book[@price] 选取bookstore拥有price属性的book元素
//book[@price=10] 选取所有price属性等于10的book元素

通配符

通配符 描述 示例 结果
* 匹配任意节点 /bookstore/* 选取bookstore下的所有元素
@* 匹配节点中的所有属性 //book[@*] 选取带有属性的book节点

运算符

运算符 描述 示例 结果
| 计算两个节点集 //book|//cd 返回拥有book和cd节点的元素集合
+ 加法 6+4 10
- 减法 6-4 2
* 乘法 6*4 24
div 除法 8 div 4 2
= 等于 price=9.8 如果price等于9.8则返回true,反之false
!= 不等于 price!=9.8 与上相反
< 小于 price<9.8 如果price小于9.8则返回true,反之false
<= 小于等于 price<=9.8 如果price小于等于9.8则返回true,反之false
> 大于 price>9.8 如果price大于9.8则返回true,反之false
>= 大于等于 price>=9.8 如果price大于等于9.8则返回true,反之false

扩展

某个属性中包含多个值可以用’contains’

"//book[contains(@label,'词')]"

lxml库

lxml 是一个xml和html解析库

book.txt

<bookstore>
    <book price='10' id='1'>西游记book>
    <book price='20' id='2'>水浒传book>
    <book price='30' id='3'>红楼梦book>
    <book price='40' id='4'>三国演义book>
    <book id='5'>金庸book>
    <book>唐诗book>
    <book label='宋朝 词'>宋词book>
bookstore>

读取文件并解析

from lxml import etree
if __name__ == "__main__":
    fp = open("book.txt",'r',encoding='utf-8')
    html_data = etree.HTML(fp.read())
    #打印出原文
    # print(etree.tostring(html_data,encoding='utf-8').decode('utf-8'))
    book_list = html_data.xpath("//book/text()")
    for book in book_list:
        print(book)
    # 或者
    parser = etree.HTMLParser(encoding='utf-8')
    html_data = etree.parse('book.txt',parser=parser)
    book_list = html_data.xpath("//book/text()")
    for book in book_list:
        print(book)

你可能感兴趣的:(Python)