别让生活的压力挤走我们快乐不管昨天发生了什么,不管昨天的自己有多难堪,有多无奈,有多苦涩,都过去了,不会再来,也无法更改!
总结:
- 推荐使用lxml作为解析器,效率高。 手动指定解析器;
3. lxml
lxml 是Python下功能丰富的XML、HTML解析库, 性能非常好, 是对libxml 2和libxslt的封装。
最新版支持Python 2.6+, python 3支持到3.6。
安装
CentOS编译安装需要
yum install libxml 2-devel libxslt-devel
注意,不同平台不一样,参看http://lxml.de/installation.html
Ixml安装
$pip install lxml
from lxml import etree
# 使用etree构建HTML
root = etree.Element('html')
print(type(root))
print(root.tag)
body = etree.Element('body')
root.append(body)
print(etree.tostring(root))
print('--------------------------------')
sub = etree.SubElement(body, 'child1') # 增加子节点
print(type(sub))
print('--------------------------------')
sub = etree.SubElement(body, 'child2').append(etree.Element('child21'))
print(etree.tostring(root, pretty_print=True).decode())
#--------------------------------------------------------------------
<class 'lxml.etree._Element'>
html
b'<html><body/></html>'
--------------------------------
<class 'lxml.etree._Element'>
--------------------------------
<html>
<body>
<child1/>
<child2>
<child21/>
</child2>
</body>
</html>
安装插件XPath Helper 豆瓣电影口碑榜单etree还提供了2个有用的函数
etree.HTML(text)解析HTML文档,返回根节点
anode.xpath('xpath路径') 对节点使用xpath语法
1. 练习:爬取“口碑榜”
从豆瓣电影中提取“本周口碑榜”
import requests
from lxml import etree
# ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"
url = "https://movie.douban.com/"
req = requests.request('GET',url,headers={'User-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"})
if req:
html = req.text # 分析的 HTML
# print(text[:800])
root = etree.HTML(html) # 分析HTML,返回DOM根节点;
titles = root.xpath('//div[@class="billboard-bd"]//a/text()') # 匹配文本,返回列表
print(titles)
#-----------------------------------------------
['少年邦', '欢迎来到车臣', '寅次郎的故事:欢迎归来', '索莱', '八佰', '最好的还未到来', '影里', '春江水暖', '耳光', '夏日国度']
4. Beautiful Soup 4**
Beautiful Soup可以从HTML、XML中提取数据。目前BS 4在持续开发
官方中文文档
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
安装
$pip install beautifulsoup4
导入
from bs 4 import BeautifulSoup初始化
BeautifulSoup(markup="", features=None)
markup,被解析对象,可以是文件对象或者html字符串
features指定解析器 ,返回一个文档对象
4.1 解析器
安装解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:
$ apt-get install Python-lxml
$ easy_install lxml
$ pip install lxml
$ apt-get install Python-html5lib
$ easy_install html5lib
$ pip install html5lib
常用解析器比较
可以不指定解析器,就依赖系统已经安装的解析器库了。
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内置标准库执行速度适中文档容错能力强 | Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | 速度快文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml", "xml"])``BeautifulSoup(markup, "xml") | 速度快唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 | 速度慢 |
BeautifulSoup(markup, "html.parser") 使用Python标准库,容错差且性能一般。
BeautifulSoup(markup, "lxml") 容错能力强,速度快。需要安装系统C库。
推荐使用lxml作为解析器,效率高。
请手动指定解析器,以保证代码在所有运行环境中解析器一致。
使用下面内容构建test.html使用bs4解析它
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>马哥教育欢迎您</h1>
<div id="main">
<h3 class="title highlight"><a href="http://www.python.org">python</a>高级班</h3>
<div class="content">
<p id='first'>字典</p>
<p id='second'>列表</p>
<input type="hidden" name="_csrf" value="7139e401481ef2f46ce98b22af4f4bed">
<!-- comment -->
<img id="bg1" src="http://www.magedu.com/">
<img id="bg2" src="http://httpbin.org/">
</div>
</div>
<p>bottom</p>
</body>
</html>
4.2 四种对象
BeautifulSoup将HTML文档解析成复杂的树型结构,每个节点都是Python的对象,可分为4种:
BeautifulSoup、Tag、NavigableString、Comment
BeautifulSoup对象
BeautifulSoup对象代表整个文档。
Tag对象
它对应着HTML中的标签。有2个常用的属性:
- name:Tag对象的名称,就是标签名称 如 soup.p,p标签;
- attrs:标签的属性字典,返回值为字典
属性 可以被修改、删除
多值属性 对于class属性可能是下面的形式, <h3 class="title highlight">python高级班</h3> ,这
个属性就是多值({'class': ['title', 'highlight']})
from bs4 import BeautifulSoup
with open('./test.html',encoding='utf-8') as f:
soup = BeautifulSoup(f,'lxml')
print(soup.builder) # 解析器
print('------------------------------')
print(soup.p,type(soup.p)) # 第一行 匹配值(深度优先,一直往里面钻)
print(soup.p.attrs,type(soup.p.attrs)) # 输出为字典
print(soup.h3.attrs)
print('------------------------------')
print(type(soup.div))
print(soup.div.div)
print('------------------------------')
print(soup.div.get('id')) # 类似与字典的 提取;
print(soup.div.attrs['id'])
print(soup.div.div.get('class'))
print(soup.div.attrs.get('class','1001')) # 为默认值;
print('------------------------------')
print(soup.img.get('src'))
soup.img['src'] = '123' # 替换
print(soup.img.get('src'))
print(soup.a) # 找不到返回None ;
#------------------------------------------------------------------------------------------------------------------------------
C:\ProgramData\Miniconda3\envs\blog\python.exe C:/Users/dell/PycharmProjects/spiders/t2.py
<bs4.builder._lxml.LXMLTreeBuilder object at 0x0000026C5B7CAB70>
------------------------------
<p id="first">字典</p> <class 'bs4.element.Tag'>
{'id': 'first'} <class 'dict'>
{'class': ['title', 'highlight']}
------------------------------
<class 'bs4.element.Tag'>
<div class="content">
<p id="first">字典</p>
<p id="second">列表</p>
<input name="_csrf" type="hidden" value="7139e401481ef2f46ce98b22af4f4bed"/>
<!-- comment -->
<img id="bg1" src="http://www.magedu.com/"/>
<img id="bg2" src="http://httpbin.org/"/>
</div>
------------------------------
main
main
['content']
1001
------------------------------
http://www.magedu.com/
123
<a href="http://www.python.org">python</a>
注意,我们一般不使用上面这种方式来操作HTML,此代码是为了熟悉对象类型
NavigableString
读取文本信息
如果只想输出标记内的文本,而不关心标记的话,就要使用NavigableString。
print(soup.div.p.string) # 第一个div下第一个p的字符串
print(soup.p.string) # 同上
#------------------------------------------------
字典
字典
注释对象
这就是HTML中的注释,它被BeautifulSoup解析后对应Comment对象。
网友评论