美文网首页
63.2-lxml爬取口碑榜和bs4基本概念

63.2-lxml爬取口碑榜和bs4基本概念

作者: BeautifulSoulpy | 来源:发表于2020-08-28 17:36 被阅读0次

别让生活的压力挤走我们快乐不管昨天发生了什么,不管昨天的自己有多难堪,有多无奈,有多苦涩,都过去了,不会再来,也无法更改!


总结:

  1. 推荐使用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>

etree还提供了2个有用的函数
etree.HTML(text)解析HTML文档,返回根节点
anode.xpath('xpath路径') 对节点使用xpath语法

安装插件XPath Helper 豆瓣电影口碑榜单
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个常用的属性:

  1. name:Tag对象的名称,就是标签名称 如 soup.p,p标签;
  2. 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对象。

相关文章

网友评论

      本文标题:63.2-lxml爬取口碑榜和bs4基本概念

      本文链接:https://www.haomeiwen.com/subject/wsplsktx.html