Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

内容整理自中国大学MOOC——北京理工大学-蒿天-基于bs4库的HTML页面遍历方法

我们使用如下链接作为实验对象

https://python123.io/ws/demo.html

页面信息如下

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

利用requests库爬取出网页的HTML完整代码

import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
print(demo)

网页内容如下

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

熟悉HTML页面架构的都知道,HTML页面中有两大类标签,<head>和<body>,这两类标签在当前HTML信息中都有展现。

然后我们就可以根据HTML的格式架构,产生三种遍历HTML标签的方法:从HTML根标签向子标签的向下遍历,从子标签向根标签的向上遍历,同级标签间的平行遍历。

1.下行遍历

import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
print(soup.head)  #获取HTML网页的head标签部分

首先我们获取HTML中head部分的信息

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

 然后我们利用contents属性,取当前head中所有子标签的信息

print(soup.head.contents)

内容如下

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

 当前head标签中仅有一组<title></title>标签,<title>标签内容被放入列表中

contents会将当前部分的所有标签存入列表(返回结果为一个列表形式)

同理,<body>标签中的全部内容也可用contents进行获取

print(soup.body.contents)

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

应该注意到,不是只有被标签标记的内容才被视为子标签信息,像当前<body>中的‘\n‘等内容同样被视为子标签节点。

验证统计的当前<body>标签内子标签节点的个数

print(len(soup.body.contents))

结果为5

(通过观察也不难发现,body.contents这个list中,list(0),list(2),list(4)均为换行符,list(1),list(3)分别为一个<p>)

读取body.contents列表中第2个元素也不难

print(soup.body.contents[1])

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

用.children属性迭代遍历<body>标签下的各子节点

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

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

2.上行遍历

利用.parent属性遍历节点的父亲标签

利用.parents属性遍历节点的所有先辈标签,返回迭代类型

print(soup.title.parent)

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

 <title>的父辈节点是<head>标签

print(soup.html.parent)

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

<html>作为一级标签,它的父辈节点就是它本身

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

而soup的父辈节点为空

一次性完成当前页面上行遍历

import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

3.平行遍历

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

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

.next_siblings  迭代返回HTML文本顺序的后续所有平行节点

.previous_siblings  迭代返回返回HTML文本顺序的先前所有平行节点

所有平行遍历必须发生自同一个父节点下

比如<head>与<body>下的不同标签不能通过平行节点进行跨越遍历

单次遍历

print(soup.a.next_sibling)

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

平行遍历获得的下一个节点未必一定是标签类型 

迭代遍历

for siblilng in soup.a.next_siblings:
    print(siblilng)

Python爬虫入门——利用bs4库对HTML页面信息进行遍历读取

相关推荐