采集相关文章(创建一个网络爬虫来抓取网页输出结果的之前函数)

优采云 发布时间: 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 函数也很有用。

  处理父元素

  和上面一样

  关键字父

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线