表达式 | 描述 | 示例 | 结果 |
---|---|---|---|
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 是一个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)