学习网络数据采集(一)
创建一个网络爬虫来抓取 http://www.pythonscraping.com/pages/warandpeace.html这个网页。
在这个页面里,小说人物的对话内容都是红色的,人物名称都是绿色的。
抓出整个页面,然后创建一个 BeautifulSoup 对象:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
bs0bj = BeautifulSoup(html,"lxml")
nameList = bs0bj.findAll("span",{"class":"green"})
for name in nameList:
print(name.get_text())
运行结果(返回的为人物名称列表,仅列出部分结果):
Anna
Pavlovna Scherer
Empress Marya
Fedorovna
知识点一:
在BeautifulSoup中定义了两个函数:
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)
在 95% 的时间里都只需要使用前两个参数: tag 和 attributes 。
标签参数tag-----传一个标签的名称或多个标签名称组成的 Python列表做标签参数,如:
findAll({"h1","h2","h3","h4","h5","h6"}) # 需为标签,不能够为任意字符。
属性参数 attributes----用一个 Python 字典封装一个标签的若干属性和对应的属性值。如:
findAll("span", {"class":{"green", "red"}}) # (标签,{“标签”:{“属性一”,“属性二”,“属性三”.......}})
递归参数 recursive-----一个布尔变量,默认为True, findAll 会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签。如果 recursive 设置为 False , findAll 就只查找文档的一级标签。(一般不需设置)文本参数 text----用标签的文本内容去匹配,而不是用标签的属性。假如我们想查找前面网页中包含“the prince”内容的标签数量,我们可以把之前的 findAll 方法换成下面的代码:
nameList = bsObj.findAll(text="the prince")
print(len(nameList))
范围限制参数 limit----只用于 findAll 方法。 find 其实等价于 findAll 的 limit 等于1 时的情形。
关键词参数 keyword----可以让你选择那些具有指定属性的标签,如:
allText = bsObj.findAll(id="text")
print(allText[0].get_text())
知识点二:
get_text()函数功能为,去掉超链接、段落和标签都清除掉,只剩下一串不带标签的文字。
用 BeautifulSoup 对象查找你想要的信息,比直接在 HTML 文本里查找信息要简单得多。通常在你准备打印、存储和操作数据时,应该最后才使用 .get_text() 。一般情况下,你应该尽可能地保留 HTML 文档的标签结构。
补充知识点:
标签:如<html>、<span>、<head>、<body>、<abbr>等,一般查看网站源码,发现在符号“<>”里面的便为标签(我猜的!!如有错误请大神指正。)
参考文献:
《Python网络数据采集》