Step 1 : 获取HTML文件的内容
# encoding: UTF-8
# 爬虫获取:南方电网招标采购信息
import requests
# 定义主入口网址
main_url = "http://www.bidding.csg.cn/zbcg/index.jhtml"
# 请求网址
r = requests.get(main_url)
# 打印:返回结果的类型,状态码,编码方式,Cookies
print(type(r))
print(r.status_code)
print(r.encoding)
print(r.cookies)
# 打印返回的内容
print(r.text)
Step 2 : 创建BeautifulSoup对象
from bs4 import BeautifulSoup
requests
1. 基本Get
支持get, put, delete, head, options
r = request.get('http://www.baidu.com')
加参数的Get(Params)
url = 'http://.......'
payload = {'key1':'value1', 'key2':'value2'}
r = request.get(url, params=payload)
BeautifulSoup
四大对象种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
1. Tag
- Tag通常来说就是HTMl中的一个标签。可以用来查找一个标签的内容,比如此处获取 title 标签:
print soup.title
- 对于Tag,有两个重要的属性
- name
print soup.title.name
- 输出对象的名称
- attrs
print soup.a.attrs
- 输出对象的属性,类型是一个字典
- 获取单独某个属性
print soup.a[href]
`print soup.a.get('href')
2. NavigableString
获取标签内部的文字
print soup.a.string
3. BeautifulSoup对象
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性
4. Comment
Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。
遍历文档树
1. 直接子节点
- .contents
- tag 的 .content 属性可以将tag的子节点以列表的方式输出
print soup.head.contents
print soup.head.contents[0]
- .children
print soup.head.children
for child in soup.body.children:print child
2. 所有子孙节点
- .descendants
for child in soup.descendants:print child
3. 节点内容
如果一个标签里面没有标签了,那么 .string 就会返回标签里面的内容。如果标签里面只有唯一的一个标签了,那么 .string 也会返回最里面的内容
4.多个内容
1. .strings
获取多个内容,不过需要遍历
2. .stripped_strings
输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容
父节点(加s表示全部)
Tag的父节点:Tag.parent
- .parent
兄弟节点(加s表示全部)
Tag的兄弟节点:Tag.next-sibling
- .next_sibling
- .previous_sibling
搜索文档树
find_all(name, attrs, recursive, text, **kwargs)
搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
name
- 可以查找所有名字为name的tag,字符串对象会被忽略
- A. 传字符串
print soup.find_all('a')
- 查找文档中所有的标签
- B. 传正则表达式
soup.find_all(re.compile("^b"))
- 查找文档中以b开头的标签
- C. 传列表
soup.find_all(['a','b')
- 查找文档中全部a和b标签
- D. 传True
- 查找全部Tag,但是不会返回字符串节点
- E. 传方法
- 还可以定义一个方法,方法只接受一个元素参数 [4] ,如果这个方法返回 True 表示当前元素匹配并且被找到,如果不是则反回 False
KeyWord
- 如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性
soup.find_all(href=re.compile("elsie"))
- 使用多个指定名字的参数可以同时过滤tag的多个属性
soup.find_all(href=re.compile("elsie"), id='link1')
- 如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性
- text
- 搜索字符串内容
- 同样可以像name的可选参数一样