# CSS选择器 BeautifulSoup4
- 现在使用BeautifulSoup4
- 官方文档 http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
- 几个常用提取信息工具的比较:
- 正则: 很快,不好用,不许安装
- beautifulsoup:慢,使用简单,安装简单
- lxml: 比较快,使用简单,安装一般
- 案例v33.py
from bs4 import BeautifulSoup
from urllib import request
url = "http://www.baidu.com"
rsp = request.urlopen(url)
content = rsp.read()
print(content) #bytes类型
soup = BeautifulSoup(content,'lxml')
print(type(soup)) #<class 'bs4.BeautifulSoup'>
print(soup)
print("*"*20)
con = soup.prettify()
print(type(con)) #<class 'str'>
print(con)
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
- Tag
- 对应Html中的标签
- 可以通过soup.tag_name
- tag两个重要属性
- name
- attrs
- 案例a34
from urllib import request
from bs4 import BeautifulSoup
import re
url = "http://www.baidu.com"
req = request.urlopen(url)
content = req.read()
soup = BeautifulSoup(content,'lxml')
print("**"*20)
tags = soup.find_all(re.compile("^me"))
print(type(tags)) #<class 'bs4.element.ResultSet'>
for tag in tags:
print(tag) #<meta content="always" name="referrer"/>
"""
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
<meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
<meta content="always" name="referrer"/>
<meta content="#2932e1" name="theme-color"/>
<meta content="0; url=/baidu.html?from=noscript" http-equiv="refresh"/>
"""
"""
>>>tag.attrs
{'http-equiv': 'content-type', 'content': 'text/html;charset=utf-8'}
{'http-equiv': 'X-UA-Compatible', 'content': 'IE=Edge'}
{'content': 'always', 'name': 'referrer'}
{'name': 'theme-color', 'content': '#2932e1'}
{'http-equiv': 'refresh', 'content': '0; url=/baidu.html?from=noscript'}
"""
- NavigableString
- 对应内容值
- BeautifulSoup
- 表示的是一个文档的内容,大部分可以把他当做tag对象
- 一般我们可以用soup来表示
- Comment
- 特殊类型的NavagableString对象,
- 对其输出,则内容不包括注释符号
- 遍历文档对象
- contents: tag的子节点以列表的方式给出
- children: 子节点以迭代器形式返回
- descendants: 所子孙节点
- string
- 案例34
- 搜索文档对象
- find_all(name, attrs, recursive, text, ** kwargs)
- name:按照那个字符串搜索,可以传入的内容为
- 字符串
- 正则表达式
- 列表
- kewwortd参数,可以用来表示属性
- text: 对应tag的文本值
- 案例34
- css选择器
- 使用soup.select, 返回一个列表
- 通过标签名称: soup.select("title")
- 通过类名: soup.select(".content")
- id查找: soup.select("#name_id")
- 组合查找: soup.select("div #input_content")
- 属性查找: soup.select("img[class='photo'])
- 获取tag内容: tag.get_text
- 案例35
from urllib import request
from bs4 import BeautifulSoup
url = "http://www.baidu.com"
req = request.urlopen(url)
content = req.read()
soup = BeautifulSoup(content,'lxml')
# print(soup.prettify())
print(soup.select("title")[0].text) #百度一下,你就知道
print(soup.select("#wrapper")[0])
print(soup.select("meta[content='always']")[0])