xpath解析数据
""" xpath 也是一种用于解析xml文档数据的方式 xml path w3c xpath搜索用法 在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。都要用/ """ doc = """ <?xml version="1.0" encoding="ISO-8859-1"?> <html> <body> <bookstore id="test" class="ttt"> <book id= "1" class = "2"> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book id = "2222222222222">11111111111111111111 <title lang="abc">Learning XML</title> <price>39.95</price> </book> </bookstore> <a></a> </body> </html> """ from lxml import etree html = etree.HTML(doc) print(html.xpath("/bookstore")) # 从根标签找所有匹配的 列表形式 print(html.xpath("//bookstore")) # 全文中找所有匹配的 列表形式 # 通配符 * print(html.xpath("//book")) #全文中找所有book标签 print(html.xpath("//*")) # 全文中找所有标签 # 获取属性 print(html.xpath("//bookstore/@id")) #获取id属性 print(html.xpath("//bookstore/@*")) #获取所有属性 # 嵌套 print(html.xpath("//bookstore/book/title/text()")) ============================================================================== # 加上谓语(条件) # 指定要获取的索引 # print(html.xpath("//bookstore/book[1]/title/text()")) # 获取第一个 # print(html.xpath("//bookstore/book[last()-1]/title/text()")) # last() 最后一个 last()-1 倒数第二个 # print(html.xpath("//bookstore/book[position()>1]/title/text()")) # 索引大于1的 # xpath 原生 既能查找属性 又能查找标签 而在selenium只能查找标签 # 查找price的值大于30的book标签 # e = html.xpath("//book[price > 30]")[0] # print(e.text) # 访问文本 不包含子标签的文本 只包含自己标签的文本 # print(e.attrib) # 访问属性 # 用属性来作限制 # 只要存在lang属性即可 print(html.xpath("//*[@lang]")) # 找的是具备lang并且值为abc的标签 print(html.xpath("//*[@lang='abc']")) #获取其属性 print(html.xpath("//*[@lang='abc']")[0].attrib) # 只要 有属性即可 print(html.xpath("//*[@*]")) # 多个匹配条件 print(html.xpath("//title|//price")) ================================================================================== # 轴匹配 (先拿到一个标签 在相对这个标签找其他标签) print(html.xpath("//bookstore/ancestor::*")) # 所有先辈 print(html.xpath("//bookstore/ancestor::body")) # 所有叫body的先辈 print(html.xpath("//bookstore/ancestor-or-self::*")) # 所有先辈包含他自己 # 获取属性 print(html.xpath("//bookstore/attribute::id")) print(html.xpath("//bookstore/@id")) # 所有子级标签(只有子级) print(html.xpath("//bookstore/child::*")) # 所有后代标签 print(html.xpath("//bookstore/descendant::*")) # 在这个标签后面的所有标签 与层级无关 print(html.xpath("//book[1]/following::*")) #第一个book后的所有标签 # 获取弟弟们(他后面的同级标签) print(html.xpath("//book[1]/following-sibling::*")) # 获取哥哥们(它前面的同级标签) print(html.xpath("//book[1]/preceding-sibling::*")) # 获取父级 print(html.xpath("//book[1]/parent::*")) # 获取既有id属性 又有class属性的标签 print(html.xpath("//*[@id and @class]"))