1 urlopen 用来打开并读取一个从网络获取的远程对象。
2 估计可能出现的错误
• 网页在服务器上不存在(或者获取页面的时候出现错误)
try:
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
print(e) # 返回空值,中断程序,或者执行另一个方案 else:
# 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),
# 那么就不需要使用else语句了,这段代码也不会执行
• 服务器不存在
if html is None:
print("URL is not found")
else: # 程序继续
HTML解析
1 爬取,不同颜色。 http://www.pythonscraping.com/pages/warandpeace.html
2 name.get_text(),就可以把标 签中的内容分开显示
3 一般情况下,尽可能的保留HTML文档的标签结构。 最后使用 .get_text()
导航树
所有的子标签都是后代标 签,但不是所有的后代标签都是子标签
1 如果你只想找出子标签,可以用 .children 标签: 例如:
from urllib.request import urlopen from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html)
for child in bsObj.find("table",{"id":"giftList"}).children:
print(child)
2 descendants 后代标签
3 处理兄弟标签
BeautifulSoup 的 next_siblings() 函数可以让收集表格数据成为简单的事情,尤其是处理 带标题行的表格
next_sibling 和 previous_sibling 函数,与 next_siblings 和 previous_siblings 的作用类似,只是它们返回的是单个标签,而不是一组标签
4 父标签
parent 和 parents
正则表达式
• bbbbb 这没有什么特别的——就是 5 次 b。
• (cc)* 任意偶数个字符都可以编组,这个规则是用括号两个 c,然后后面跟一个星号,表示有 任意次两个 c(也可以是 0 次)
要注意:不同的语言,有不同的正则表达式,要看文档
正则表达式和BeautifulSoup
获取属性
对于一个标签对象,可以用下面的代码获取它的全部属性:
myTag.attrs
返回一个字典对象 。比如要获取图 片的资源位置 src,可以用下面这行代码:myImgTag.attrs["src"]
Lambda表达式
BeautifulSoup 允许我们把特定函数类型当作 findAll 函数的参数。唯一的限制条件是这些 函数必须把一个标签作为参数且返回结果是布尔类型。BeautifulSoup 用这个函数来评估它 遇到的每个标签对象,最后把评估结果为“真”的标签保留,把其他标签剔除。
如果你愿意多写一点儿代码,那么在 BeautifulSoup 里用 Lambda 表达式选择标签,将是正 则表达式的完美替代方案。
超越BeautifulSoup
• lxml 这个库(http://lxml.de/)可以用来解析 HTML 和 XML 文档,以非常底层的实现而闻名 于世,大部分源代码是用 C 语言写的。虽然学习它需要花一些时间(其实学习曲线越 陡峭,表明你可以越快地学会它),但它在处理绝大多数 HTML 文档时速度都非常快。
• HTML parser 这是 Python 自带的解析库(https://docs.python.org/3/library/html.parser.html)。因为它不 用安装(只要装了 Python 就有),所以可以很方便地使用。