python爬虫 第1天 复杂的HTML解析 45页

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解析

• 寻找“打印此页”的链接,或者看看网站有没有 HTML 样式更友好的移动版(把自己 的请求头设置成处于移动设备的状态,然后接收网站移动版,更多内容在第 12 章介绍)。 
• 寻找隐藏在 JavaScript 文件里的信息。要实现这一点,你可能需要查看网页加载的 JavaScript 文件。我曾经要把一个网站上的街道地址(以经度和纬度呈现的)整理成格 式整洁的数组时,查看过内嵌谷歌地图的 JavaScript 文件,里面有每个地址的标记点。
 • 虽然网页标题经常会用到,但是这个信息也许可以从网页的 URL 链接里获取。 
• 如果你要找的信息只存在于一个网站上,别处没有,那你确实是运气不佳。如果不只限 于这个网站,那么你可以找找其他数据源。有没有其他网站也显示了同样的数据?网站 上显示的数据是不是从其他网站上抓取后攒出来的?


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


正则表达式

• aa* a 后面跟着的 a*(读作 a 星)表示“重复任意次 a,包括 0 次”。这样就可以保证字母 a 至少出现一次。
• bbbbb 这没有什么特别的——就是 5 次 b。
• (cc)* 任意偶数个字符都可以编组,这个规则是用括号两个 c,然后后面跟一个星号,表示有 任意次两个 c(也可以是 0 次)
• (d|) 增加一个竖线(|)在表达式里表示“这个或那个”。本例是表示“增加一个后面跟着空 格的 d,或者只有一个空格”。这样我们可以保证字符串的结尾最多是一个后面跟着空 格的 d。


要注意:不同的语言,有不同的正则表达式,要看文档



正则表达式和BeautifulSoup


获取属性
比如标签 <a> 指向 的 URL 链接包含在 href 属性中,或者 <img> 标签的图片文件包含在 src 属性中


对于一个标签对象,可以用下面的代码获取它的全部属性:

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 就有),所以可以很方便地使用。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值