BeautifulSoup4系列四
前言
很多时候我们无法直接定位到某个元素,我们可以先定位它的父元素,通过父元素来找子元素就比较容易
一、子节点
1.以博客园首页的摘要为例:<div class="c_b_p_desc">这个tag为起点
2.那么div这个tag就是父节点
3."摘要: 前言 本篇详细。。。"这个string就是上面div的子节点(string通常看成是一个tag的子节点)
4."<a class="c_b_p_desc_readmore" href="http://www.cnblogs.com/yoyoketang/p/6906558.html">阅读全文</a>"这个也是div的子节点
二、.contents
1.tag对象contents可以获取所有的子节点,返回的是list
2.len()函数统计子节点的个数
3.通过下标可以取出对应的子节点

1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 r = requests.get("http://www.cnblogs.com/yoyoketang/") 6 # 请求首页后获取整个html界面 7 blog = r.content 8 # 用html.parser解析html 9 soup = BeautifulSoup(blog, "html.parser") 10 # find方法查找页面上第一个属性匹配的tag对象 11 tag_soup = soup.find(class_="c_b_p_desc") 12 # len函数获取子节点的个数 13 print len(tag_soup.contents) 14 # 循环打印出子节点 15 for i in tag_soup.contents: 16 print i 17 18 # 通过下标取出第1个string子节点 19 print tag_soup.contents[0] 20 # 通过下标取出第2个a子节点 21 print tag_soup.contents[1]

三、.children
1.点children这个生成的是list对象,跟上面的点contents功能一样
2.只是这里是list对象,就只能for循环读出了,不能通过下标获取
(一般上面那个contents用的比较多,可能children性能更快吧,我猜想的嘿嘿!)
四、.descendants
1.上面的contents只能获取该元素的直接子节点,如果这个元素的子节点又有子节点(也就是孙节点了),这时候获取所有的子孙节点就可以用.descendants方法
2.获取div的子节点有两个,子孙节点有三个,因为a标签下还有个“阅读全文”这个string子节点

1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 r = requests.get("http://www.cnblogs.com/yoyoketang/") 6 # 请求首页后获取整个html界面 7 blog = r.content 8 # 用html.parser解析html 9 soup = BeautifulSoup(blog, "html.parser") 10 # find方法查找页面上第一个属性匹配的tag对象 11 tag_soup = soup.find(class_="c_b_p_desc") 12 13 # len函数获取子节点的个数 14 print len(list(tag_soup.children)) 15 16 # 获取子孙节点的个数 17 print len(list(tag_soup.descendants)) 18 19 for i in tag_soup.descendants: 20 print i

五、爬取博客首页的标签内容
1.博客左侧的标签并不是这个链接:http://www.cnblogs.com/yoyoketang/
2.通过抓包可以看到,这个url地址是:http://www.cnblogs.com/yoyoketang/mvc/blog/sidecolumn.aspx?blogApp=yoyoketang
2.可以先定位父元素:<div class="catListTag">
六、参考代码:

1 # coding:utf-8 2 from bs4 import BeautifulSoup 3 import requests 4 5 r = requests.get("http://www.cnblogs.com/yoyoketang/mvc/blog/sidecolumn.aspx?blogApp=yoyoketang") 6 # 请求首页后获取整个html界面 7 blog = r.content 8 # 用html.parser解析html 9 soup = BeautifulSoup(blog, "html.parser") 10 tag_soup = soup.find(class_="catListTag") 11 12 # print body.prettify() 13 14 ul_soup = tag_soup.find_all("a") 15 print ul_soup 16 for i in ul_soup: 17 print i.string

BeautifulSoup4系列四的更多相关文章
- 前端构建大法 Gulp 系列 (四):gulp实战
前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...
- Netty4.x中文教程系列(四) 对象传输
Netty4.x中文教程系列(四) 对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...
- S5PV210开发系列四_uCGUI的移植
S5PV210开发系列四 uCGUI的移植 象棋小子 1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...
- WCF编程系列(四)配置文件
WCF编程系列(四)配置文件 .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...
- SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...
- VSTO之旅系列(四):创建Word解决方案
原文:VSTO之旅系列(四):创建Word解决方案 本专题概要 引言 Word对象模型 创建Word外接程序 小结 一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个 ...
- 系列四TortoiseSvn客户端软件
原文:系列四TortoiseSvn客户端软件 TortoiseSvn介绍 TortoiseSvn 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中 ...
- 【C++自我精讲】基础系列四 static
[C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
随机推荐
- springmvc当要返回中文字符串时出现乱码
当过滤器,页面编码都对,tomcat版本在8以上(8内部默认用utf-8) 在方法参数中加上,produces="text/html;charset=UTF-8" 绝对可以解决!! ...
- appcloud 加载第三方页面loading效果
apiready = function() { var header = $api.byId('header'); $api.fixIos7Bar(header); var headerPos = $ ...
- RAM建模和初始化
冯诺依曼提出的存储计算,计算存储,因此,几乎所有的CPU和ASIC都会使用存储器,它们的类型很多,包括异步RAM.同步RAM.ZBT RAM.DDR DRAM.ROM等.由于大部分的异步RAM和SRA ...
- XPath基本使用
一.简介 1.什么是XPath 1)XPath是W3C的一个标准 2)XPath 是一门在 XML 文档中查找信息的语言. 3)XPath 用于在 XML 文档中通过元素和属性进行导航. 4)XPa ...
- ubuntu16.0 安装 openstack
主要参考官方文档:https://docs.openstack.org/liberty/zh_CN/install-guide-ubuntu/environment-nosql-database.ht ...
- 自己开发的在线视频下载工具,基于Java多线程
比如这个在线视频: 我们可以正常播放,但是找不到下载按钮. 打开Chrome开发者工具,在Network标签页里能看到很多网络传输请求: 随便看一个请求的响应,发现类型为video,大小为500多k. ...
- Android(java)学习笔记145:Handler消息机制的原理和实现
联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...
- 【算法基础】欧几里得gcd求最大公约数
package Basic; import java.util.Scanner; public class Gcd { public static void main(String[] args) { ...
- Linux文件的IO操作 一
系统调用 系统调用: 操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务 为什么用户程序不能直接访问系统内核提供的服务 为了更好地保护内核空间, ...
- java HttpServletRequest 重复流读取
在用reset接口的时候,常常会使用request.getInputStream()方法,但是流只能读取一次,一旦想要加上一个过滤器用来检测用户请求的数据时就会出现异常. 在过滤器中通过流读取出用 ...