python爬虫学习(二)-以爬取豆瓣电影为例

上节回顾:python爬虫学习(一)
本节介绍如何处理提取到的HTML页面中数据。主要使用BeautifulSoup模块。

BeautifulSoup简单介绍

对象的种类:Tag NavigableString BeautifulSoup Comment

from bs4 import BeautifulSoup
soup = BeautifulSoup(get_page(url+tags[0]))

soup的类型是

实际上BeautifulSoup集成自Tag

soup.title #得到第一个title标签 豆瓣电影标签:爱情
type(soup.title) #
tag = soup.div

Tag对象的name属性返回该标签的名字

print(tag.name,type(tag.name)) #div,'str'

Tag使用类似字典的操作可以返回该标签的属性值

实际上是Tag对象中的attrs属性存储了所有该标签相关的属性值对

class属性之所以返回list而不是str是因为class属性可以有多个值

print(tag['class'],type(tag['class'])) #['global-nav']

print(tag.attrs) #{'id': 'db-global-nav', 'class': ['global-nav']}

s = soup.title.string
print(s,type(s)) #豆瓣电影标签:爱情

如果想要在BeautifulSoup之外使用NavigableString对象,需要调用unicode()方法,将该对象转换成普通Unicode字符串。

 遍历文档树
-  子节点
一个Tag可能包含多个字符串或其他的Tag,这些都是这个Tag的子节点。BeautifulSoup提供了许多操作和遍历子节点的属性。
  - Tag的cotents和children属性
  contents属性将Tag的所有直接子节点以列表的方式输出。
  children是一个生成器,可以对Tag的子节点进行循环.
  - descendants生成器
  contents和children属性仅包含tag的直接子节点。而       descendants生成器可以对tag的所有子孙节点进行递归循环。
  - string属性
如果tag只有一个NavigableString类型子节点,可以使用string得到这个子节点。而如果tag包含多个子节点,string属性无法确定该调用哪个子节点的内容,将输出None。
  - strings和stripped_strings
如果tag中包含多个字符串,可以使用strings属性啦循环获取。而输出的过程中会包含多个空格或空行,使用.tripped_strings可以去除多余的空白内容。
- 父节点
每个tag或字符串都有父节点,父节点即包含该tag的节点。
  - parent属性
通过该属性可以获取某个元素的父节点。
  - parents生成器
通过该生成器可以递归得到元素所有的父辈节点
- 兄弟节点
有相同的缩进级别,有共同的父节点。
  - next_sibling和previous_sibling
next_sibling向下查兄弟节点,previous_sibling向上查兄弟节点。
  - next_siblings和previous_siblings
通过这两个生成器,可以对当前节点的兄弟节点迭代输出。

>搜索文档树
- find_all()函数
函数签名:find_all(name,attrs,recursive,string,**kwargs)
  - name参数
name参数可以查看所有名字为name的tag,字符串对象会自动忽略掉。name参数可以使用BeautifulSoup的任一类型的过滤器。

过滤器-字符串

soup.find_all('b') #查找文档中所有的b标签

过滤器-正则表达式

soup.find_all(re.compile("^b")) #找到所有以b开头的标签

过滤器-列表

soup.find_all(['a','b']) #查找所有a标签和b标签

过滤器-True

soup.find_all(True) #匹配任何值,即查找到所有的tag

  - recursive参数
find_all()方法时,BeautifulSoup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数recursive=False
  - limit参数
find_all()方法返回全部的搜索结构,如果只需要几条结果可以是该参数limit=2表示结果只返回2个
  - string参数
通过string参数可以搜索文档中的字符串内容。与name参数的可选值一样,string参数接受字符串、正则表达式、列表和True
  - keyword参数
如果一个指定的名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索。如果包含一个名字为id的参数,bs会搜索每个tag的id属性。

soup.find_all(id='link2') #查找所有具有id='link2'属性的元素
soup.find_all(class_=True) #查找所有具有class属性的元素
soup.find_all(href=re.compile('elsie'),id='link1') #查找所有具有href和id属性的元素
soup.find_all('a',class_='link1') #查找所有a标签且具有class="link1"属性的元素


>CSS选择器

在tag或BeautifulSoup对象的select()方法中传入字符串参数,即可使用css选择器的语法来找tag

soup.select('title') #选择title元素
soup.select('body a') #选择body元素下的a元素
soup.select('#link1') #id选择器

你可能感兴趣的:(python爬虫学习(二)-以爬取豆瓣电影为例)