BeautifulSoup库的使用


使用pip install beautifulsoup4
   
   
   
  1. from bs4 import BeautifulSoup
  2. import requests
  3. r = requests.get("http://python123.io/ws/demo.html")
  4. print r.text
  5. print BeautifulSoup(r.text,'html.parser').prettify()
BeautifulSoup的基本元素
BS4库是解析,遍历,维护“标签树”的功能库
BeautifulSoup库 指代一个标签树
BeautifulSoup库对应于一个HTML或XML文档的全部内容
BS库的解析器
解析器 使用方法 条件
bs4的HTML解析器 BeautifulSoup(mk,'html.parser') 安装bs4库
lxml的HTML解析器 BeautifulSoup(mk,'lxml') pip install lxml
lxml的XML解析器 BeautifulSoup(mk,'xml') pip install lxml
html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib
标签的基本元素
基本元素 说明
Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name 标签的名字,<p>...</p>的名字的'p',格式:<tag>.name
Attributes 标签的属性,字典形式组织,格式<tag>.attrs
NavigableString 标签内非属性字符串,<>...</>中的字符串,格式:<tag>.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型<!--comment-->
title
soup.<tag>
BS库的HTML文档的遍历
标签树的下行遍历


属性 说明
.contents 子节点的列表,将<tag>所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子的节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
示例
  
  
  
  1. from bs4 import BeautifulSoup
  2. import requests
  3. r = requests.get("http://python123.io/ws/demo.html")
  4. demo = r.text
  5. s = BeautifulSoup(demo,'html.parser')
  6. print s.prettify()
  7. print s.body.contents
  8. for child in s.body.children:
  9. print(child)
  10. for child in s.body.descendants:
  11. print(child)
标签树的上午遍历


属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
示例
   
   
   
  1. from bs4 import BeautifulSoup
  2. import requests
  3. r = requests.get("http://python123.io/ws/demo.html")
  4. demo = r.text
  5. s = BeautifulSoup(demo,'html.parser')
  6. print s.prettify()
  7. for parent in s.a.parents:
  8. if parent is None:
  9. print parent
  10. else:
  11. print parent.name
平行遍历


属性 说明
.next_sibiling 返回按照HTML文本顺序的下一个平行节点的标签
.previous_sililing 返回按照HTML文本顺序的止一个平行节点的标签
.next_sibilings 迭代类型,返回按照HTML文本顺序的后续所有平行节点的标签
.previous_sibilings 迭代类型,返回按照HTML文本顺序的前续所有平行节点的标签
注意:同一父节点的儿子节点才构成平行遍历的关系
 
 
信息标记的三种形式
HTML语言可以将超文件内容(即声音,图片,视频等内容)嵌入到文本当中
XML扩展标记语言
实例
 

  JSON JavaScript Object Notation
key:value键值对
实例
 

 YMAL
采用无类型的键值对来表示信息
实例


标记语言 特点 应用场景
XML 最早的通用信息标记语言,可扩展性好,但繁琐 Internet上的信息交互与传递
JSON 信息有类型,适合程序处理(js),较XML简洁 移动应用云端和节点的信息通信,无注释
YAML 信息无类型,文本信息比例较高,可读性较好 种类系统的配置文件,有注释易读
结合形式解析和搜索方法,提取关键信息
XML JSON YAML 搜索
需要标记解析器及文本查找函数
实例:解析一个文档中的所有链接信息
   
   
   
  1. from bs4 import BeautifulSoup
  2. import requests
  3. r = requests.get("http://python123.io/ws/demo.html")
  4. demo = r.text
  5. s = BeautifulSoup(demo,'html.parser')
  6. for link in s.find_all('a'):
  7. print link.get('href')
<>.find_all(name,attrs,recursive,string,**kwargs)
name: 需要检索的标签的名字,可以是列表,是True的话将返回所有的标签
attrs: 要检索的标签的属性值 ,e.g. soup.find_all('p','course') soup.find_all(id='link1')  soup.find_all(id = re.compile(u'link'))
recursive: 是否递归的检索子孙后代节点,默认是True
string: <>...</>中的字符串区域的检索字符串 soup.find_all(string = re.compile(u'python'))
<tag>(...)来代替<tag>.find_all(...)
soup.(...)来代替soup .find_all(...)  
 实例1:中国大学排名的定向爬虫
版本1
      
      
      
  1. #CrawUnivRankingA.py
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import bs4
  5. def getHTMLText(url):
  6. try:
  7. r = requests.get(url, timeout=30)
  8. r.raise_for_status()
  9. r.encoding = r.apparent_encoding
  10. return r.text
  11. except:
  12. return ""
  13. def fillUnivList(ulist, html):
  14. soup = BeautifulSoup(html, "html.parser")
  15. for tr in soup.find('tbody').children:
  16. if isinstance(tr, bs4.element.Tag):
  17. tds = tr('td')
  18. ulist.append([tds[0].string, tds[1].string, tds[3].string])
  19. def printUnivList(ulist, num):
  20. print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))
  21. for i in range(num):
  22. u=ulist[i]
  23. print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
  24. def main():
  25. uinfo = []
  26. url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
  27. html = getHTMLText(url)
  28. fillUnivList(uinfo, html)
  29. printUnivList(uinfo, 20) # 20 univs
  30. main()
输出
  版本2
      
      
      
  1. #CrawUnivRankingB.py
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import bs4
  5. def getHTMLText(url):
  6. try:
  7. r = requests.get(url, timeout=30)
  8. r.raise_for_status()
  9. r.encoding = r.apparent_encoding
  10. return r.text
  11. except:
  12. return ""
  13. def fillUnivList(ulist, html):
  14. soup = BeautifulSoup(html, "html.parser")
  15. for tr in soup.find('tbody').children:
  16. if isinstance(tr, bs4.element.Tag):
  17. tds = tr('td')
  18. ulist.append([tds[0].string, tds[1].string, tds[3].string])
  19. def printUnivList(ulist, num):
  20. tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
  21. print(tplt.format("排名","学校名称","总分",chr(12288)))
  22. for i in range(num):
  23. u=ulist[i]
  24. print(tplt.format(u[0],u[1],u[2],chr(12288)))
  25. def main():
  26. uinfo = []
  27. url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
  28. html = getHTMLText(url)
  29. fillUnivList(uinfo, html)
  30. printUnivList(uinfo, 20) # 20 univs
  31. main()
输出
 

 

 

 

 









免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM