采集相关文章(创建一个网络爬虫来抓取网页输出结果的之前函数)
优采云 发布时间: 2022-04-08 17:07采集相关文章(创建一个网络爬虫来抓取网页输出结果的之前函数)
文章目录
python数据采集2-HTML解析BeautifulSoup
CSS 可以区分 HTML 元素,
让那些装饰完全相同的元素显得不一样。例如,一些标签如下所示:
和
网络爬虫可以通过类属性的值轻松区分两个不同的标签。例如,他们可以使用
BeautifulSoup 抓取页面上的所有红色文本,但没有抓取绿色文本。因为 CSS 是通过属性来限定的
网站 样式被正确渲染,因此您可以放心,大多数现代 网站 资源上的 class 和 id 属性资源都非常
富有的。
让我们创建一个网络爬虫来爬取
这一页。
新闻hao123地图视频贴吧学术登录设置更多产品
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 22 07:20:19 2018
@author:
"""
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.baidu.com")
bsObj = BeautifulSoup(html, "html.parser")
nameList = bsObj.findAll("a", {"class":"mnav"})
for name in nameList:
print(name.get_text())
输出结果
新闻
hao123
地图
视频
贴吧
学术
以前,我们调用 bsObj.tagName 只获取页面中第一个指定的标签。现在我们
调用 bsObj.findAll(tagName, tagAttributes) 获取页面中所有指定的标签,而不仅仅是
第一个。
获取namelist列表后,程序遍历列表中的所有名字,然后打印name.get_text(),即可
勾选标记的内容单独显示。
get_text() 将从您正在处理的 HTML 文档中删除所有标签,并返回
仅收录文字的字符串。假设您正在处理大量的超链接、段落和标签
签署了一大段源代码,然后 .get_text() 将清除这些超链接、段落和标签,
只剩下一串未标记的文本。
使用 BeautifulSoup 对象来查找您想要的信息,而不是直接在 HTML 文本中。
利息就简单多了。通常当您准备好打印、存储和操作数据时,您应该最后使用它
使用 .get_text()。一般来说,您应该尽可能地保留 HTML 文档的标签结构。
BeautifulSoup 的 find() 和 findAll()
BeautifulSoup 中的 find() 和 findAll() 可能是您最常使用的两个函数。有了它们,您可以
通过标签的不同属性轻松过滤 HTML 页面,以找到所需的标签组或单个标签。
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)
注解
tag标签参数,前面已经介绍过——可以将一个标签名或多个标签名传递给Python
列表作为标签参数。例如,以下代码将返回 HTML 文档中所有标题标签的列表:
.findAll({"h1","h2","h3","h4","h5","h6"})
attributes 属性参数是用一个 Python 字典来封装一个标签的几个属性和对应的属性值,
例子
例如,以下函数将返回 HTML 文档中的红色和绿色 span 标签:
.findAll("span", {"class":{"green", "red"}})
recursive 递归参数是一个布尔变量。如果 recursive 设置为 False,findAll 将只查找文档的第一级标签。找到所有
默认是支持递归搜索(recursive的默认值为True)
text 参数有点不同,它使用标签的文本内容来匹配,而不是标签的属性。要是我们
要查找上一个网页中收录“王子”内容的标签数量,我们可以将之前的 findAll 方法替换为
进入以下代码:
nameList = bsObj.findAll(text="学术")
print(len(nameList))
输出为“1”。
限制范围限制了参数,显然只针对 findAll 方法。find实际上相当于findAll的极限等于
1点的情况。
关键字关键词 参数允许您选择具有指定属性的标签。例如:
allText = bsObj.findAll(id="text")
print(allText[0].get_text())
注意
以下两行代码完全相同:
bsObj.findAll(id="text")
bsObj.findAll("", {"id":"text"})
使用关键字偶尔会出现问题,尤其是在查找带有类属性的标签时,
因为 class 在 Python 中是一个受保护的关键字。
bsObj.findAll(class="green")
正确的姿势
bsObj.findAll(class_="green")
bsObj.findAll("", {"class":"green"})
导航树
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 22 07:46:57 2018
@author:
"""
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.baidu.com")
bsObj = BeautifulSoup(html, "html.parser")
print(bsObj.html.body.a)
输出
//www.baidu.com/img/baidu_jgylogo3.gif
处理子标签
百度部分代码
新闻
hao123
地图
视频
贴吧
学术
登录
设置更多产品
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 22 07:46:57 2018
@author:
"""
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.baidu.com")
bsObj = BeautifulSoup(html,"lxml")
for child in bsObj.find("div",{"id":"u1"}).children:
print(child)
输出结果
新闻
hao123
地图
视频
贴吧
学术
登录
设置
更多产品
处理兄弟标签
BeautifulSoup 的 next_siblings()
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 22 07:46:57 2018
@author:
"""
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.baidu.com")
bsObj = BeautifulSoup(html, "html.parser")
for sibling in bsObj.find("div",{"id":"u1"}).a.next_siblings:
print(sibling)
hao123
地图
视频
贴吧
学术
登录
设置
更多产品
和 next_siblings 一样,如果你可以很容易地找到一组兄弟标签中的最后一个标签,那么
previous_siblings 函数也很有用。
处理父元素
和上面一样
关键字父