lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择
XPath于1999年11月16日成为W3C标准,它被设计为供XSLT、XPointer以及其他XML解析软件使用,更多的文档可以访问其官方网站:https://www.w3.org/TR/xpath/
参考:http://www.cnblogs.com/zhangxinqi/p/9210211.html
XPath常用规则
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 通配符,选择所有元素节点与元素名 |
@* | 选取所有属性 |
[@attrib] | 选取具有给定属性的所有元素 |
[@attrib='value'] | 选取给定属性具有给定值的所有元素 |
[tag] | 选取所有具有指定元素的直接子节点 |
[tag='text'] | 选取所有具有指定元素并且文本内容是text节点 |
XPath中的运算符
运算符 | 描述 | 实例 | 返回值 |
or | 或 | age=19 or age=20 | 如果age等于19或者等于20则返回true反正返回false |
and | 与 | age>19 and age<21 | 如果age等于20则返回true,否则返回false |
mod | 取余 | 5 mod 2 | 1 |
| | 取两个节点的集合 | //book | //cd | 返回所有拥有book和cd元素的节点集合 |
+ | 加 | 6+4 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 6*4 | 24 |
div | 除法 | 8 div 4 | 2 |
= | 等于 | age=19 | true |
!= | 不等于 | age!=19 | true |
< | 小于 | age<19 | true |
<= | 小于或等于 | age<=19 | true |
> | 大于 | age>19 | true |
>= | 大于或等于 | age>=19 | true |
实例:
获取开发语言top20
import urllib.request from lxml import etree import copy class TOP20: def __init__(self,url): self.Tops = [] self.url = url self.response = self.getresponse() self.page = self.getetree() #end def def getresponse(self): return urllib.request.urlopen(self.url) #end def def getetree(self): return etree.HTML(self.response.read(),parser=etree.HTMLParser(encoding='utf-8')) #end def def gettop20(self): results = self.page.xpath('//table[@class="table table-striped table-top20"]/tbody/tr/td/text()') DICT = {"2018": '', "2017": "", "language": "", "grade": "", "change": ""} for i in range(20): DICT["2018"] = results[0] DICT["2017"] = results[1] DICT["language"] = results[2] DICT["grade"] = results[3] DICT["change"] = results[4] del results[0:5] self.Tops.append(copy.deepcopy(DICT)) #end for #end def def printtop20(self): for top in self.Tops: print(top) #end for #end def #end class if __name__=="__main__": tops = TOP20("https://www.tiobe.com/tiobe-index/") tops.gettop20() tops.printtop20()
备案审查(qq.com):
import urllib.request from bs4 import BeautifulSoup from lxml import etree import copy headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'} request = urllib.request.Request("http://icp.chinaz.com/qq.com",headers=headers) response = urllib.request.urlopen(request) page = etree.HTML(response.read(),parser=etree.HTMLParser(encoding='utf-8')) if page.xpath('//div[@class="Tool-IcpMainCent wrapper02"]/p[@class="tc col-red fz18 YaHei pb20"]/text()'): print(page.xpath('//div[@class="Tool-IcpMainCent wrapper02"]/p[@class="tc col-red fz18 YaHei pb20"]/text()')) else: print(page.xpath('//div[@class="Tool-IcpMainCent wrapper02"]/div[@class="pr zI0"]/ul[@id="first"]/li/p/text()')) print(page.xpath('//div[@class="Tool-IcpMainCent wrapper02"]/div[@class="pr zI0"]/ul[@id="first"]/li/p/strong/text()')) print(page.xpath('//div[@class="Tool-IcpMainCent wrapper02"]/div[@class="pr zI0"]/ul[@id="first"]/li/p/font/text()'))