BeautifulSoup库的基本使用

简介

正则表达式对于我们来说用起来是不方便的,而且需要记很多规则,所以用起来不是特别熟练。 BeautifulSoup库一个灵活又方便的网页解析库,处理高效,支持多种解析器。 利用它就不用编写正则表达式也能方便的实现网页信息的抓取。

中文参考文档

安装

image.png

基础使用

  1. from bs4 import BeautifulSoup
  2. html = '''
  3. <body>
  4. <header id="header">
  5. <h3 id="name">小强也可爱</h3>
  6. <title>标题</title>
  7. <div class="sns">
  8. <a href="http://www.kaikeba.com/feed/" target="_blank" rel="nofollow" title="RSS"><i class="fa fa-rss" aria-hidden="true"></i></a>
  9. <a href="http://kaikeba.com/kaikeba" target="_blank" rel="nofollow" title="Weibo"><i class="fa fa-weibo" aria-hidden="true"></i></a>
  10. <a href="https://www.kaikeba.com/in/kaikeba" target="_blank" rel="nofollow" title="Linkedin"><i class="fa fa-linkedin" aria-hidden="true"></i></a>
  11. <a href="mailto:kaikeba@gmail.com" target="_blank" rel="nofollow" title="envelope"><i class="fa fa-envelope" aria-hidden="true"></i></i></a>
  12. </div>
  13. <div class="nav">
  14. <ul><li class="current-menu-item"><a [href="http://www.kaikeb](http://www.kaikeba.com/)a.com/">hello</a></li>
  15. <li><a [href="http://www.kaikeba.com/about-me/">word](http://www.kaikeba.com/about-me/)
  16. <li><a [href="http://www.kaikeba.com/post-search/">nihao>
  17. <li><a [href="http://www.kaikeba.com/wp-login.php">kkb](http://www.kaikeba.com/wp-login.php)
  18. </ul> </div>
  19. </header>
  20. </body> '''
  21. soup = BeautifulSoup(html,'lxml')
  22. # 格式化输出 soup 对象的内容
  23. print(soup.prettify())
  24. # 根据标签名获取整个标签(但是拿出的是第一个) print(soup.li)
  25. # 获取标签的名字
  26. print(soup.title.name)
  27. # 获取标签中的文本
  28. print(soup.title.string)
  29. # 获取标签title的父标标签
  30. print(soup.title.parent.name)
  31. # 获取li标签的子标签
  32. print(soup.li.contents)
  33. # 获取便签的属性值的两种方式
  34. print(soup.li["class"]) print(soup.li.attrs['class'])
  35. # 使用select,css选择器
  36. print(soup.select('li'))
  37. # 类 名 前 加 .,id 名 前 加 #
  38. print(soup.select('.current-menu-item'))
  39. # 获取内容
  40. print(soup.select('.current-menu-item')[0].get_text())
  41. # 获取属性值
  42. print(soup.select('.current-menu-item')[0].attrs['class'])
  43. # 获取li标签下面的子标签
  44. print(soup.select('li > a')[1].get_text())
  45. # 使用find和findall进行查找
  46. print(soup.find('li',attrs={'class':'current-menu-item'}))
  47. print(soup.find_all('li',attrs={"class":"current-menu-item"})[0])

Xpath的基本使用

简介

XPath 是一门在 XML 文档中查找信息的语言。 使用路径表达式来选取 XML 文档中的节点或者节点集。注意: xpath速度比较快,是爬虫在网页定位中的较优选择,但是很多网页前端代码混乱难以定位。

安装:pip install lxml

语法

xpath的更多语法)

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

基础使用

  1. # 导入lxml的etree库
  2. from lxml import etree
  3. data_str = """
  4. <div>
  5. <ul>
  6. <li class="item-0"><a href="link1.html">first item</a></li>
  7. <li class="item-1"><a href="link2.html">second item</a></li>
  8. <li class="item-inactive"><a href="link3.html">third item</a></li>
  9. <li class="item-1"><a href="link4.html">fourth item</a></li>
  10. <li class="item-0"><a href="link5.html">fifth item</a>
  11. </ul>
  12. </div>
  13. """
  14. # 注意: 该数据中缺少了一个li标签的闭合标签
  15. # 利用etree.HTML可以将字符串或者bytes转化为Element python对象,这个对象具有Xpath的方法
  16. html = etree.HTML(data_str)
  17. # print(html)
  18. # etree.tostring(html)可以自动修正HTML代码,补全了缺胳膊少腿的标签
  19. # 使用为了观察修改以后的html样子,根据修改后的HTML去写Xpath
  20. result = etree.tostring(html)
  21. print(result.decode("utf-8"))
  22. # 获取class =item-1 的 a标签的href属性
  23. result = html.xpath('//li[@class="item-1"]/a/@href')
  24. print(result)
  25. # 获取class =item-1 的 a标签的文本值
  26. result = html.xpath('//li[@class="item-1"]/a/text()')
  27. print(result)

PyQuery的使用

简介

pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档, 易用性和解析速度都很好,和它差不多的还有BeautifulSoup,都是用来解析的。

官方文档

安装

终端执行: pip install pyquery

文件中测试: import pyquery

初始化pyquery对象

  1. #将字符串初始化
  2. html = """
  3. <html lang="en">
  4. <head>
  5. <title>PyQuery</title>
  6. </head>
  7. <body>
  8. <ul id="container">
  9. <li class="o1">MM</li>
  10. <li class="o2">MN</li>
  11. <li class="o3">GN</li>
  12. </ul>
  13. </body>
  14. </html> """
  15. from pyquery import PyQuery as pq
  16. #初始化为PyQuery对象
  17. doc = pq(html)
  18. print(type(doc))
  19. print(doc)
  20. # 将HTML文件初始化
  21. doc = pq(filename = './pyquery_demo.html')
  22. print(type(doc))
  23. print(doc)
  24. # 对网址响应进行初始化
  25. doc = pq(url='http://www.baidu.com')
  26. print(type(doc))
  27. print(doc)

常用css选择器获取标签

  1. html = """
  2. <html lang="en">
  3. <head>
  4. <title>PyQuery</title>
  5. </head>
  6. <body>
  7. <ul id="container">
  8. <li class="o1">MM</li>
  9. <li class="o2 active">MN<a class='o22'>fad</a></li>
  10. <li class="o3">GN</li>
  11. </ul>
  12. </body>
  13. </html>
  14. """
  15. from pyquery import PyQuery as pq
  16. #用css选择器来实现,如果要选id前面加#,如果选class,前面加.,如果选标签名,什么也不加
  17. doc = pq(html)
  18. # 根据标签
  19. # print(doc('title'))
  20. # print(doc('#container'))
  21. #print(doc('.o1'))
  22. # 组合标签
  23. print(doc('.o2.active'))#空格表示里面,没有空格表示整体
  24. print(doc('.o2 .o22'))#空格表示里面,没有空格表示整体
  25. # 伪类选择器
  26. # print(doc('li:nth-child(2)'))
  27. # 根据标签内容获取标签
  28. # print(doc("li:contains('MM')"))
  29. #利用find方法
  30. # print(doc.find('li'))
  31. # 也可以用.children()查找直接子元素
  32. # container = doc.find('#container')
  33. # print(container.children())
  34. #.parent()查找对象的父元素
  35. # object_2 = doc.find('.o2')
  36. # print(object_2.parent())
  37. #.parents()祖先节点
  38. # object_2 = doc.find('.o2')
  39. # parent = object_2.parents('#container')#当然也可以传入参数# print(parent)
  40. #.siblings()兄弟元素,即同级别的元素,不包括自己
  41. # object_2 = doc.find('.o2')
  42. # print(object_2.siblings())
  43. # 遍 历
  44. # doc = pq(html)
  45. # lis = doc('li').items()#.items会是一个生成器
  46. # print(type(lis))
  47. # for li in lis: # print(li)
  48. # 5.filter() ——根据类名、id名得到指定元素,例:
  49. # d=pq("<div><p id='1'>test 1</p><p class='2'>test 2</p></div>")
  50. # d('p').filter('#1') #返回[<p#1>]
  51. # d('p').filter('.2') #返回[<p.2>]
  52. # 6.eq(index) ——根据给定的索引号得到指定元素
  53. # 接上例,若想得到第二个p标签内的内容,则可以:
  54. # print d('p').eq(1).html() #返回test 2

获取标签信息

  1. html = """
  2. <html lang="en">
  3. <head>
  4. <title>PyQuery</title>
  5. </head>
  6. <body>
  7. <ul id="container">
  8. <li class="o1">MM</li>
  9. <li class="o2 active">MN<a class='o22'>fad</a></li>
  10. <li class="o3">GN</li>
  11. </ul>
  12. </body>
  13. </html>
  14. """
  15. from pyquery import PyQuery as pq
  16. doc = pq(html)
  17. # 获取属性值
  18. # o2 = doc.find('.o2')
  19. # print(o2.attr('class'))
  20. # 获取文本值
  21. o2 = doc.find('.o2')
  22. print(o2.text())