当前位置:   article > 正文

爬虫Beautiful Soup方法选择器_beautifulsoup div 查找ul

beautifulsoup div 查找ul

一 点睛

Beautiful Soup为我们提供了一些查询方法,比如find_all()和find()等,调用它们,然后传入相应的参数,就可以灵活查询了。

find_all()

find_all,顾名思义,就是查询所有符合条件的元素。给它传入一些属性或文本,就可以得到符合条件的元素,它的功能十分强大。

它的API如下:

find_all(name , attrs , recursive , text , **kwargs)

二 name

1 根据节点名查询元素

1.1 代码

  1. html='''
  2. <div class="panel">
  3. <div class="panel-heading">
  4. <h4>Hello</h4>
  5. </div>
  6. <div class="panel-body">
  7. <ul class="list" id="list-1">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>
  12. <ul class="list list-small" id="list-2">
  13. <li class="element">Foo</li>
  14. <li class="element">Bar</li>
  15. </ul>
  16. </div>
  17. </div>
  18. '''
  19. from bs4 import BeautifulSoup
  20. soup = BeautifulSoup(html, 'lxml')
  21. print(soup.find_all(name='ul'))
  22. print(type(soup.find_all(name='ul')[0]))

1.2 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. [<ul class="list" id="list-1">
  3. <li class="element">Foo</li>
  4. <li class="element">Bar</li>
  5. <li class="element">Jay</li>
  6. </ul>, <ul class="list list-small" id="list-2">
  7. <li class="element">Foo</li>
  8. <li class="element">Bar</li>
  9. </ul>]
  10. <class 'bs4.element.Tag'>

1.3 说明

这里我们调用了find_all()方法,传入name参数,其参数值为ul。也就是说,我们想要查询所有ul节点,返回结果是列表类型,长度为2,每个元素依然都是bs4.element.Tag类型。

2 嵌套查询

2.1 代码

  1. html='''
  2. <div class="panel">
  3. <div class="panel-heading">
  4. <h4>Hello</h4>
  5. </div>
  6. <div class="panel-body">
  7. <ul class="list" id="list-1">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>
  12. <ul class="list list-small" id="list-2">
  13. <li class="element">Foo</li>
  14. <li class="element">Bar</li>
  15. </ul>
  16. </div>
  17. </div>
  18. '''
  19. from bs4 import BeautifulSoup
  20. soup = BeautifulSoup(html, 'lxml')
  21. for ul in soup.find_all(name='ul'):
  22. print(ul.find_all(name='li'))

2.2 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
  3. [<li class="element">Foo</li>, <li class="element">Bar</li>]

2.3 说明

返回结果是列表类型,列表中的每个元素依然还是Tag类型。

3 获取文本

3.1 代码

  1. html='''
  2. <div class="panel">
  3. <div class="panel-heading">
  4. <h4>Hello</h4>
  5. </div>
  6. <div class="panel-body">
  7. <ul class="list" id="list-1">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>
  12. <ul class="list list-small" id="list-2">
  13. <li class="element">Foo</li>
  14. <li class="element">Bar</li>
  15. </ul>
  16. </div>
  17. </div>
  18. '''
  19. from bs4 import BeautifulSoup
  20. soup = BeautifulSoup(html, 'lxml')
  21. for ul in soup.find_all(name='ul'):
  22. print(ul.find_all(name='li'))
  23. for li in ul.find_all(name='li'):
  24. print(li.string)

3.2 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
  3. Foo
  4. Bar
  5. Jay
  6. [<li class="element">Foo</li>, <li class="element">Bar</li>]
  7. Foo
  8. Bar

三 attrs

1 属性查询标准写法

1.1 代码

  1. html='''
  2. <div class="panel">
  3. <div class="panel-heading">
  4. <h4>Hello</h4>
  5. </div>
  6. <div class="panel-body">
  7. <ul class="list" id="list-1" name="elements">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>
  12. <ul class="list list-small" id="list-2">
  13. <li class="element">Foo</li>
  14. <li class="element">Bar</li>
  15. </ul>
  16. </div>
  17. </div>
  18. '''
  19. from bs4 import BeautifulSoup
  20. soup = BeautifulSoup(html, 'lxml')
  21. print(soup.find_all(attrs={'id': 'list-1'}))
  22. print(soup.find_all(attrs={'name': 'elements'}))

1.2 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. [<ul class="list" id="list-1" name="elements">
  3. <li class="element">Foo</li>
  4. <li class="element">Bar</li>
  5. <li class="element">Jay</li>
  6. </ul>]
  7. [<ul class="list" id="list-1" name="elements">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>]

1.3 说明

这里查询的时候传入的是attrs参数,参数的类型是字典类型。比如,要查询id为list-1的节点,可以传入attrs={'id': 'list-1'}的查询条件,得到的结果是列表形式,包含的内容就是符合id为list-1的所有节点。在上面的例子中,符合条件的元素个数是1,所以结果是长度为1的列表。

2 属性查询简单写法

2.1 代码

  1. html='''
  2. <div class="panel">
  3. <div class="panel-heading">
  4. <h4>Hello</h4>
  5. </div>
  6. <div class="panel-body">
  7. <ul class="list" id="list-1" name="elements">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>
  12. <ul class="list list-small" id="list-2">
  13. <li class="element">Foo</li>
  14. <li class="element">Bar</li>
  15. </ul>
  16. </div>
  17. </div>
  18. '''
  19. from bs4 import BeautifulSoup
  20. soup = BeautifulSoup(html, 'lxml')
  21. # 对于一些常用的属性,比如id和class等,我们可以不用attrs来传递。
  22. # 比如,要查询id为list-1的节点,可以直接传入id这个参数。
  23. print(soup.find_all(id='list-1'))
  24. print(soup.find_all(class_='element'))

2.2 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. [<ul class="list" id="list-1" name="elements">
  3. <li class="element">Foo</li>
  4. <li class="element">Bar</li>
  5. <li class="element">Jay</li>
  6. </ul>]
  7. [<li class="element">Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>, <li class="element">Foo</li>, <li class="element">Bar</li>]

2.3 说明

这里直接传入id='list-1',就可以查询id为list-1的节点元素了。而对于class来说,由于class在Python里是一个关键字,所以后面需要加一个下划线,即class_='element',返回的结果依然还是Tag组成的列表。

四 text

1 点睛

text参数可用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象。

2 代码

  1. import re
  2. html='''
  3. <div class="panel">
  4. <div class="panel-body">
  5. <a>Hello, this is a link</a>
  6. <a>Hello, this is a link, too</a>
  7. </div>
  8. </div>
  9. '''
  10. from bs4 import BeautifulSoup
  11. soup = BeautifulSoup(html, 'lxml')
  12. print(soup.find_all(text=re.compile('link')))

3 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. ['Hello, this is a link', 'Hello, this is a link, too']

4 说明

这里有两个a节点,其内部包含文本信息。这里在find_all()方法中传入text参数,该参数为正则表达式对象,结果返回所有匹配正则表达式的节点文本组成的列表。

五 find()函数

1 点睛

除了find_all()方法,还有find()方法,只不过后者返回的是单个元素,也就是第一个匹配的元素,而前者返回的是所有匹配的元素组成的列表。

2 代码

  1. html='''
  2. <div class="panel">
  3. <div class="panel-heading">
  4. <h4>Hello</h4>
  5. </div>
  6. <div class="panel-body">
  7. <ul class="list" id="list-1">
  8. <li class="element">Foo</li>
  9. <li class="element">Bar</li>
  10. <li class="element">Jay</li>
  11. </ul>
  12. <ul class="list list-small" id="list-2">
  13. <li class="element">Foo</li>
  14. <li class="element">Bar</li>
  15. </ul>
  16. </div>
  17. </div>
  18. '''
  19. from bs4 import BeautifulSoup
  20. soup = BeautifulSoup(html, 'lxml')
  21. print(soup.find(name='ul'))
  22. print(type(soup.find(name='ul')))
  23. print(soup.find(class_='list'))

3 结果

  1. E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
  2. <ul class="list" id="list-1">
  3. <li class="element">Foo</li>
  4. <li class="element">Bar</li>
  5. <li class="element">Jay</li>
  6. </ul>
  7. <class 'bs4.element.Tag'>
  8. <ul class="list" id="list-1">
  9. <li class="element">Foo</li>
  10. <li class="element">Bar</li>
  11. <li class="element">Jay</li>
  12. </ul>

4 说明

这里的返回结果不再是列表形式,而是第一个匹配的节点元素,类型依然是Tag类型。

六 其他函数

另外,还有许多查询方法,其用法与前面介绍的find_all()、find()方法完全相同,只不过查询范围不同,这里简单说明一下。

  • find_parents()和find_parent():前者返回所有祖先节点,后者返回直接父节点。

  • find_next_siblings()和find_next_sibling():前者返回后面所有的兄弟节点,后者返回后面第一个兄弟节点。

  • find_previous_siblings()和find_previous_sibling():前者返回前面所有的兄弟节点,后者返回前面第一个兄弟节点。

  • find_all_next()和find_next():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。

  • find_all_previous()和find_previous():前者返回节点后所有符合条件的节点,后者返回第一个符合条件的节点。

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号