python之屏幕抓取

Tidy 和 HTML 解析

Beautiful Soup

 

  屏幕抓取:是通过程序下载网页并从中提取信息的过程。

  简单来见:下载数据并对其进行分析

  思路:可使用urllib来获取网页的HTML代码,再使用正则表达式从中提取信息。

  例如:假设要从python Job Board(http://python.org/jobs)提取招聘单位的名称和网站。

  通过查看该网站的源代码,可发现类似于下面的链接中找到名称和URL:

<a href="/jobs/1970/">Python Engineer</a>

  如下:简单的屏幕抓取程序

from urllib.request import urlopen
import re
p = re.compile('<a href="(/jobs/\\d+)/">(.*?)</a>')
text = urlopen('http://python.org/jobs').read().decode()
for url,name in p.findall(text):
    print('{}({})'.format(name,url))

  以上代码需要跟进的地方:

  1.正则表达式一点都不容易理解。如果HTML代码和查询更复杂,那正则表达式就难以理解和维护

  2.无法处理独特的HTML内容;比如CDATA部分和实符字体(如&amp)

  

  正则表达式依赖于HTML代码的细节,并不是抽象的结构;意味着只要网页的结构发生一点点变化,那这个程序可能就无效了。

  针对基于正则表达式的方法存在的问题,可有两种解决方案:

(1)结合使用程序Tidy(一个python库)和XHTML解析

  (2) 使用专为屏幕抓取而设计的Beautiful Soup

 

Tidy 和XHTML解析

  Tidy是用于对格式不正确且不严谨的HTML进行修复的工具,它非常聪明,能够修复很多常见的错误,从而完成大量你不愿意做的工作。它还提供了极大的配置空间,让你能够开 / 关各种校正。

  当然,Tidy并不能修复HTML文件存在的所有问题,但确实能够确保文件是格式良好的(即所有元素都嵌套正确),这让解析工作容易很多。

  获取Tidy

  有多个用于python的Tidy库包装器,至于哪个最新并非固定不变的,找使用pip来找出可供使用的包装器:

$pip search tidy

  可选择安装PyTidyLib:

$ pip install pytidylib

  并非一定要安装Tidy库包装器。如果你是用的是unix或者linux系统,很可能已经默认安装了命令行版Tidy。此外,不管使用的是什么系统,都可以从Tidy网站上获取可执行的二进制版本,有了二进制版本之后,就可以使用模块subprocess(或其他包含open函数的模块)来运行Tidy程序了。

  如果python找不到tidy,可能需要提供这个可执行文件的完整路径。

  

  XHTML 和 HTML的主要区别在于,XHTML非常严格,要求显式地结束所有的元素;

  因此,在HTML可通过(使用标签<p>)开始另一个段落来结束当前段落,但在XHTML中,必须先(使用标签</p>)显式地结束当前段落。这让XHTML解析起来容易得多,因为你能清除地直到何时进入或者离开各种元素,

  XHTML的另一个优点:它是一种XML方言,可食用各种出色的工具(XPath)来处理

  要求对Tidy生成的格式良好的XHTML进行解析,一种非常简单的方式就是使用标准库模块html.parser中的HTMLParser类

 待补充~ 

posted @ 2018-09-25 14:50  FlameLuo  阅读(7343)  评论(0编辑  收藏  举报