Python for Infomatics 第12章 网络编程三(译)
注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。
12.5 HTML分析和网页抓取
urllib库一项最常用的功能是抓取网页。就是我们编写一个程序,将自己伪装成网页浏览器,在获取网页之后,再以查找模式检索网页中的数据。
以搜索引擎Google为例,它将查看一个网页的源码,然后抽取其中的链接,再用这些链接获取网页、抽取链接,并一直循环。使用这个技巧,Google几乎爬遍网页上的所有页面。
Google同时利用链接在网页中出现的频次,评估一个网页的的重要性,以及排列在搜索结果中的先后。
12.6 用正则表达式分析HTML
用正则表达式重复查找和抽取匹配特定模式的内容来分析HTML是一个简单的方法。下面是一个简单的网页:
<h1>The First Page</h1>
<p>
If you like, you can switch to the
<a href="http://www.dr-chuck.com/page2.htm">
Second Page</a>.
</p>
我们可以创建一个格式良好的正则表达式来匹配和抽取上面文本中的链接内容,具体如下:
href="http://.+?"
我们的正则表达式查找以“href="http://"开始的,后面跟着一个或更多的字符".+?",最后是另一个双引号。在加号后面的问号表示这个表达式的匹配是”非贪婪“模式。”非贪婪“模式是最小匹配模式,而”贪婪“模式试图找到最大可能的匹配字符串。
我们还需在正则表达式中添加括号,从而抽取我们想要的匹配字符串,并编写以下程序:
import urllib.request
import re url = input('Enter - ')
html = urllib.request.urlopen(url).read().decode('utf-8')
links = re.findall('href="(http://.+?)"', html)
for link in links:
print(link)
正则表达式的findall()方法将为我们抽取一个匹配的字符串列表,即在两个双引号直接的链接文本。
当我们运用这个程序,我们将得到以下输出:
python urlregex.py
Enter - http://www.dr-chuck.com/page1.htm
http://www.dr-chuck.com/page2.htm
python urlregex.py
Enter - http://www.py4inf.com/book.htm
http://www.greenteapress.com/thinkpython/thinkpython.html
http://allendowney.com/
http://www.py4inf.com/code
http://www.lib.umich.edu/espresso-book-machine
http://www.py4inf.com/py4inf-slides.zip
当你的HTML格式良好并可预见的,那么正则表达式将工作得非常好,但是因为那里还有很多不完整的HTML,你会发现只用正则表达式可能会漏掉一些有效的链接或者被坏的数据结束掉。这样的问题可以用一个强健的HTML分析库BeautifulSoup解决。下一节我们将讲如何用BeatuifulSoup分析HTML。
(译者注:在上面这个程序中你收入http://www.sina.com.cn,你会发现程序因解码异常终止,将程序稍作修改解决异常终止,但仍然抓取不到链接信息)。
import urllib.request
import re url = input('Enter - ')
html = urllib.request.urlopen(url).read()
links = re.findall(b'href="(http://.*?)"', html)
for link in links:
print(link.decode('utf-8'))
Python for Infomatics 第12章 网络编程三(译)的更多相关文章
- Python for Infomatics 第12章 网络编程一(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...
- Python for Infomatics 第12章 网络编程六(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...
- Python for Infomatics 第12章 网络编程五(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.8 用urllib读取二进 ...
- Python for Infomatics 第12章 网络编程四(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...
- Python for Infomatics 第12章 网络编程二(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.3 用HTTP协议获取一张 ...
- python之路(12)网络编程
前言 基于网络通信(AF_INET)的socket(套接字)实现了TCP/UDP协议 目录 基于TCP协议的socket 基于UDP协议的socket TCP协议下粘包现象及处理 使用socketse ...
- Python for Infomatics 第13章 网页服务三(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 13.6 应用程序接口API 现 ...
- CSAPP:第十一章 网络编程
CSAPP:第十一章 网络编程 11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口 11.1 客户端服务器模型 每个网络应用都是基于客户端-服务器模型.采用这个模型,一个应用是 ...
- Python学习day34-面向对象和网络编程总结
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
随机推荐
- 11月8日PHP练习《留言板》
一.要求 二.示例页面 三.网页代码及网页显示 1.denglu.php 登录页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- 创建ServiceArea
/// <summary> /// Services the area. /// </summary> /// <param name="networkData ...
- QT读取文本(字符串)最后一行的方法
QString str; QTextStream ts(&str); str = this->toPlainText(); ts.seek(str.lastIndexOf("- ...
- linux安装php & nginx
1.安装libxml2 地址:http://ftp.gnome.org/pub/GNOME/sources/libxml2/ wget http://caesar.acc.umu.se/pub/GNO ...
- Android-做个性化的进度条
1.案例效果图 2.准备素材 progress1.png(78*78) progress2.png(78*78) ...
- https://zeroc.com/index.html
https://zeroc.com/index.html http://blog.shutupandcode.net/?p=1085
- python虚拟机中的异常流控制
异常:对程序运行中的非正常情况进行抽象.并且提供相应的语法结构和语义元素,使得程序员能够通过这些语法结构和语义元素来方便地描述异常发生时的行为. 1.Python中的异常机制: 1.1Python虚拟 ...
- Shell脚本
shell script,是一种为shell编写的脚本程序. 业界所说的shell通常是指shell脚本.shell和shell script.
- linux c 笔记-4 工程项目阅读推荐
作者:周子涵链接:https://www.zhihu.com/question/27705862/answer/37738315来源:知乎著作权归作者所有,转载请联系作者获得授权. 转自网上不知道什么 ...
- cf596d
题意:有一排等高的树木,高度都为h.给出每棵树在数轴上的坐标,每次有可能是最左边或者最右边的立着的树倒下,概率都是0.5.最终所有树都倒下.每棵树在倒下的时候有p的概率向左倒,1-p的概率向右倒.如果 ...