BeautifulSoup将html文档转换成一个属性结构,每个节点都是python对象。这样我们就能针对每个结点进行操作。参考如下代码
def parse_url():
    try:
        req=urllib2.Request('http://www.xunsee.com/article/8c39f5a0-ca54-44d7-86cc-148eee4d6615/index.shtml')
        fd=urllib2.urlopen(req)
       
html=BeautifulSoup(fd)     except urllib2.URLError,e:
        print e
BeautifulSoup中传入的就是urlopen中反馈的html网页。但是出现提示
E:\python2.7.11\python.exe E:/py_prj/test.py
E:\python2.7.11\lib\site-packages\bs4\__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
 
The code that caused this warning is on line 43 of the file E:/py_prj/test.py. To get rid of this warning, change code that looks like this:
 
 BeautifulSoup([your markup])
 
to this:
 
 BeautifulSoup([your markup], "lxml")
 
  markup_type=markup_type))

这个提示的意思是没有给BeautifulSoup中传递一个解析网页的方式。有2中方式可以使用:html.parser以及lxml。这里我们先用html.parser,lxml后面再讲。代码改成如下就OK了

html=BeautifulSoup(fd,"html.parser")

在解析网页前,我们先来看几个概念,标签,属性。

比如下面的网页结构。<a href=”1.shtml”>第一节</a> 其中a就是标签,里面的href就是属性。第一节就是标签的内容

BeautifulSoup中查找属性的方法如下:

print html.meta.encode('gbk')
print html.meta.attrs
结合如下的代码,查找tag为meta的元素。并打印meta的所有属性:

得到的结果如下:

E:\python2.7.11\python.exe E:/py_prj/test.py

<meta content="text/html; charset=gbk" http-equiv="Content-Type"/>

{u'content': u'text/html; charset=gb2312', u'http-equiv': u'Content-Type'}

如果想得到某项属性,可以按照如下的方式:

print html.meta.attrs['content'] 输出结果是text/html
 

如果我们想得到标签的内容也就是文本怎么办呢,比如下面的这个方式

print html.title.string.encode('gbk') .string的功能就是得到标签所对应的文本
但是上面的方法只能找出第一个满足的标签,如果网页中有多个相同名字的标签该如何区分呢,比如下面的这种场景:有多个span以及a的标签

那么就需要另外的方式来获取。如下代码用find_all的方式来获取所有标签为a的结构并打印出来
for a in html.find_all('a'):
    print a.encode('gbk')
得到的结果如下,由于太多,只列出了其中一部分。

如果想得到这些节点的内容可以用get_text()的方法。如下:
for a in html.find_all('a'):
    print a.get_text()
如果想得到这些节点的全部属性,则可以用下面的方法:
for a in html.find_all('a'):
    print a.attrs
如果想得到某个属性的值,前面的a.attrs返回的是一个字典。比如下面的要获取class属性的值,用如下的方法
for a in html.find_all('a'):
    print a.attrs['class']
find_all方法还可以给查找加限定值:比如想获取如下所示的<a href=”1.shtml”>的标签

这里第一个参数代表标签名字,第二参数代表属性名
for a in html.find_all('a',href="1.shtml"):
    print a.encode('gbk')
还可以设定多个参数查找,比如查找form这个标签

for a in html.find_all('form',method="post",target="_blank"):
    print a.encode('gbk')
当然在查找里面也可以运用正则表达式,比如re.complie(“a.*”)之类的方法
另外还可以限制查找的数目:下面的表达式就是获取前5条查找结果
for a in html.find_all('a',limit=5):
    print a.attrs['class']
find家族里面还有find_parents/find_parent查找父节点。Find_next_siblings()/find_next_sibling()查找下一个兄弟以及
find_previous_siblings()/find_previous_sibling()查找前面的兄弟节点。



												

python网络爬虫之beautfiulSoup的更多相关文章

  1. 关于Python网络爬虫实战笔记③

    Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...

  2. 关于Python网络爬虫实战笔记①

    python网络爬虫项目实战笔记①如何下载韩寒的博客文章 python网络爬虫项目实战笔记①如何下载韩寒的博客文章 1. 打开韩寒博客列表页面 http://blog.sina.com.cn/s/ar ...

  3. python 网络爬虫(二) BFS不断抓URL并放到文件中

    上一篇的python 网络爬虫(一) 简单demo 还不能叫爬虫,只能说基础吧,因为它没有自动化抓链接的功能. 本篇追加如下功能: [1]广度优先搜索不断抓URL,直到队列为空 [2]把所有的URL写 ...

  4. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  5. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

  6. Python 正则表达式 (python网络爬虫)

    昨天 2018 年 01 月 31 日,农历腊月十五日.20:00 左右,152 年一遇的月全食.血月.蓝月将今晚呈现空中,虽然没有看到蓝月亮,血月.月全食也是勉强可以了,还是可以想像一下一瓶蓝月亮洗 ...

  7. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

  8. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  9. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

随机推荐

  1. SOA与基于CDIF的API的联动

    几千年来,巴别塔的故事一直是人类面对的一个核心的困境.为了交流和沟通我们人类创造出语言,但沟通与交流仍然存在障碍……相同语言之间的沟通依语境的不同,尚且存在巨大的鸿沟,不同语言之间更是让人坐困愁城. ...

  2. poj2566尺取变形

    Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronaut ...

  3. 关于WordPress搬家方法步骤的整理

    最近准备更换自己的博客服务器,所以需要将原来服务器上的所有东西都搬到新的服务器.为了数据的安全,在网上找了很多的资料.现在整理一下整个搬家过程的操作步骤.下面进入正题: 1.测试环境这次我使用的示例服 ...

  4. 【vue系列之一】使用vue脚手架工具搭建vue-webpack项目

    对于Vue.js来说,如果你想要快速开始,那么只需要在你的html中引入一个<script>标签,加上CDN的地址即可.但是,这并不算是一个完整的vue实际应用.在实际应用中,我们必须要一 ...

  5. 0基础搭建Hadoop大数据处理-集群安装

    经过一系列的前期环境准备,现在可以开始Hadoop的安装了,在这里去apache官网下载2.7.3的版本 http://www.apache.org/dyn/closer.cgi/hadoop/com ...

  6. sysbench压测mysql

    MySQL数据库测试 select   1.先创建数据库test,再准备数据 time /usr/local/sysbench/bin/sysbench --test=oltp --num-threa ...

  7. shell入门笔记1:执行方式、运行方式、变量、替换

    说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell的两种执行方式 交互式(interactive) 解释执行用户的命令,用户输入一条命令,She ...

  8. Oracle数据库悲观锁与乐观锁详解

    数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.而乐 ...

  9. jqPaginator 项目中做分页的应用技巧

    最近做后台管理系统,分页用到的不少,项目中其实已经有分页功能的组件但是不够高度自定义,于是就找到了 jqPaginator 高度自定义的Html结构 初始化引用如下: $("#paginat ...

  10. SQLiteDatabase的使用

    新建DBHeler.JAVA package com.hixin.db; import java.util.ArrayList; import java.util.HashMap; import co ...