从BeautifulSoup说起

BeautifulSoup是解析、遍历、维护“标签树”的功能库

一、html基础

1. HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的.

举个栗子:<h1>这是一个标题</h1> <h2>这是一个标题</h2> <h3>这是一个标题</h3>

2. HTML 段落是通过标签 <p> 来定义的.

举个栗子:<p>这是一个段落。</p> <p>这是另外一个段落。</p>

 

3. HTML 链接 HTML 链接是通过标签 <a> 来定义的.

举个栗子:<a href="http://www.runoob.com">这是一个链接</a>

 
在 href 属性中指定链接的地址。

4. HTML 图像是通过标签 <img> 来定义的.

举个栗子:<img src="/images/logo.png" width="258" height="39" />
 

注意: 图像的名称和尺寸是以属性的形式提供的。

5. <body>定义了一个主 体

一般而言,html的结构为:

 

<html>   标签树
    <body>
        <p class = "title">....</p>
    <body>
</html>

示意图如下

 

 

 

 二、正式说beutifulSoup库

1. 一般导入用 from bs4 import BeautifulSoup

2. BeautifulSoup类的五个基本元素(每个部分即对应html的一个部分)

3. tag的方法:soup.<tag>访问获得HTML中的标签,当HTML文档中存在多个相同的<tag>对应的内容时,soup.<tag>返回第一个,

所以可以用find_all('a')找全部。

 

 

 

下面以这段html源码为例子:

 

1 <html><head><title>This is a python demo page</title></head>
2 <body>
3 <p class="title"><b>The demo python introduces several python courses.</b></p>
4 <p class="course">Python is a wonderful general-purpose programming language. You can learn Python from novice to professional by tracking the following courses:
5 <a href="http://www.icourse163.org/course/BIT-268001" class="py1" id="link1">Basic Python</a> and <a href="http://www.icourse163.org/course/BIT-1001870001" class="py2" id="link2">Advanced Python</a>.</p>
6 </body></html>

 

 python代码,导入模块

import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
taga = soup.a ###即a标签的内容

3.1 <tag>.name 标签的名字,得到的为字符串类型,<p>...</p>的名字为p

eg.

soup.a.name
>>'a'

3.2  <tag>.attrs 标签的属性,字典形式的组织

taga = soup.a
taga.attrs ##由此可见一个标签可以有多个属性
>>{'id' : 'link1', 'class' : ['py1'], 'href' : 'http://.....'}
taga.attrs[id] #标签的属性为字典类型,从而属性是成对出现
>>link1

3.3 <tag>.string 标签内非属性字符串(NavigableString),他有时可以跨越多个层次, 结果是<>....</>中的字符串,尖括号内的内容可能是单单一个标签名,也可能是加了一大堆属性

eg.

3.4 tag的comment,标签内字符串的注释部分,一种特殊的comment类

 

 

总结起来就是最后这幅图,而且后三种元素都相当与在tag之下才能使用,分别可以用到标签名,属性,NavigableString,comment

 

 

三、标签树遍历方法

1 标签树的下行遍历

1.1 下行遍历主要是三种方法:<tag>.contents、children、descendants 

<tag>.contents 子节点的列表,将<tag>所有子节点存入列表

.children子节点的迭代类型,与.contents类似,用于循环遍历子节点

.desendants子孙节点(即子节点和子节点的子节点等,是别人的子节点都会符合条件)的迭代类型,包含所有子孙节点,用于循环遍历

下行遍历的两个方法

1.2 (1)遍历子节点

for child in soup.body.contents
    print(child)

     (2)遍历孙节点

for child in soup.body.descendants:
    print(child)

 

 2 标签树的上行遍历

2.1 上行遍历的两个方法:<tag>.parent,<tag>.parents

.parent 节点的父亲标签

parents节点先辈标签的迭代类型,用于循环遍历先辈节点

2.2 上行遍历的例子

soup=BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

此方法会遍历先辈节点,包括soup本身,所以要区别判断

3. 标签树的平行遍历(平行的前提是在同一个父节点下边)

3.1 标签树平行遍历的属性

.next_sibling 返回按照HTML文本顺序的下一个平行节点标签

.previous_sibling返回按照HTML文本顺序的上一个平行节点标签

.next_siblings迭代类型,返回按照HTML文本顺序的后续所有平行节点标签

.previous_siblings迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

3.2 平行遍历的两种方法

遍历前序节点
for ping in soup.a.previous_sibling:
    print(ping)
for ping in soup.a.next_sibling:#遍历后续节点
    print(ping)

 

四、BeautifulSoup库的四种解析器

 

 

 

 

 

 

posted @ 2017-08-14 13:06  shapeofu  阅读(615)  评论(0编辑  收藏  举报