Web页面数据解析处理方法 urllib3和requests库都是围绕支持HTTP协议实现客户端功能。但是在对页面解析处理上他们可能并不能提供更多的帮助,我们需要借助专门的Web页面数据解析库来解析并提取出结构化结果数据。
Web页面的解析方法通常可以用下面三种方法:
正则表达式 : 将页面当做文本处理,简单直接,大面积撒网。 XPath : XPath路径表达式可以让我们像访问目录一样访问Web页面的所有节点元素, 精准匹配。 CSS Selector : CSS 选择器Selector 与XPath相似,以CSS样式的表达式来定位节点元素, 精准匹配。 正则表达式 Python中的正则表达式库re 是我们最为常用的正则库,一条正则表达式可以帮我们过滤掉无用数据,只提取我们需要的格式数据。
在处理网页时,我们并不会频繁的全页面匹配,可想而知这样的效率极低,通常我们需要缩小数据匹配的范围节点,在小范围内进行正则匹配。而缩小范围的方法常常会结合XPath或者Selector一起完成,所以要学会三种方法的配合使用。
有时候,可能一条正则表达式就可以提取出所有我们需要的结果,例如下面这个提取IP:端口的正则表达式:
Python 1 2 3 4 5 6 7 8 9 10 11 import requests import re url = 'https://free-proxy-list.net/anonymous-proxy.html' r = requests.get(url, timeout=10) pr_re = r'<td.*?>.*?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?</td>.*?<td.*?>.*?(\d+).*?</td>' proxies = re.findall( pr_re, r.text) proxy_list=[] for proxy in proxies: proxy_list.append(':'.join(proxy[0:2])) print('\n'.join(proxy_list)) XPath XPath路径表达式可以让我们像访问目录一样访问Web页面的所有节点元素, 精准匹配。 想了解XPath的详细信息,可以阅读XPath快速了解,接下来我们说明下如何在Python中使用XPath
支持XPath的库有lxml、parsel ,其实还有很多,只不过这两个是API接口非常好用的库。
lxml是基于C语言开发库libxml2和libxslt实现的,因此速度上是非常快的(远高于Python自带的ElementTree,所以ElementTree很少被使用)。并且使用cssselect库扩展支持了CSS选择器接口。
parsel则是在lxml基础上的更高级别封装,并且提供了XPath、CSSSelector和re正则表达式三种提取方式的支持,封装的接口也是更加简单易用。同时,parsel也是scrapy所使用的选择器。
lxmlXPath解析示例 XPath表达式有时候我们不知道如何写时,我们可以通过功浏览器的开发者工具帮助获取XPath,具体方法为:...