Python之爬虫-- 页面解析和数据提取

目录

页面解析和数据提取

Beautiful Soup 4.2.0 文档

一、简介

         二、bs4的使用 

       1、导入模块

       2、获取节点

       3、寻找节点


页面解析和数据提取

一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。内容一般分为两部分,非结构化的数据结构化的数据

  • 非结构化数据:先有数据,再有结构,
  • 结构化数据:先有结构、再有数据

不同类型的数据,我需要采用不同的方式来处理。

  • 非结构化的数据处理
    • 文本、电话号码、邮箱地址:
      • 正则表达式
    • html文件:
      • 正则表达式
      • xpath
      • css选择器
      • bs4 
  • 结构化的数据处理
    • json文件:
      • jsonPath
      • 转化成Python类型进行操作(json类)
    • xml文件:
      • 转化成Python类型(xmltodict)
      • XPath
      • CSS选择器
      • 正则表达式 

Beautiful Soup 4.2.0 文档

更为详细内容,可参考官方文档,URL:http://beautifulsoup.readthedocs.io/zh_CN/latest/ 

一、简介

官方文档:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0

https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

Beautiful Soup是一个HTML / XML的解析器,主要的功能是解析和提取HTML / XML数据。

lxml只会局部遍历,而Beautiful Soup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。

BeautifulSoup用来解析HTML比较简单,API非常人性化,支持CSS选择器,Python标准库中的HTML解析器,也支持lxml的XML解析器。

Beautiful Soup 3目前已经停止开发,推荐现在的项目使用Beautiful Soup 4.使用pip安装即可:pip install beautifulsoup4

抓取工具 速度 使用难度 安装难度
正则 最快 困难 无(内置)
BeautifulSoup 最简单 简单
LXML 简单 一般

二、bs4的使用 

1、导入模块

#安装 Beautiful Soup
pip install html5lib
#安装解析器
pip install lxml 

2、获取节点

from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title title1">
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <em>hello</em>
    <b>The Dormouse's story</b>
    <i>haskdjfhakjsf</i>
</p>

<p class="story" id='story'>

    <i>
        <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
        <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
        <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
    </i>

</p>

<p class="story">...</p>
"""
# 用lxml格式解析html 解析器
# soup = BeautifulSoup(html_doc,"lxml")
soup = BeautifulSoup(html_doc,"html5lib")
# print(soup)
# print(type(soup))
# 格式化
# print(soup.prettify())
# 标签选择
print('soup.title 输出:',soup.title)
# 打印第一个
print('soup.p 输出:',soup.p)
# 获取文本内容
#get_text() 获取当前标签下,子孙标签的所有文本
print('soup.i.get_text() 输出:',soup.i.get_text())
# string只能获取当前标签下的文本
print('soup.i.string 输出:',soup.i.string)
print('soup.i.text 输出:',soup.i.text)
# 标签属性
print('soup.title.name 输出:',soup.title.name)
# attrs所有的属性,字典字典{"属性名":[值]}
print('soup.p.attrs 输出:',soup.p.attrs)
# 访问属性
print("soup.p.attrs['class'] 输出:",soup.p.attrs['class'])
# 直接访问属性
print("soup.p['class'] 输出:",soup.p['class'])
# 获取父节点
print("soup.p.parent 输出:",soup.p.parent)
# 获取祖父节点
# print("soup.p.parents 输出:",soup.p.parents)

3、寻找节点

3.1 通过find()来查找

#只找第一个
# find
# name=None, 便签名
#attrs={} ,属性名
# 只找第一个标签
print(soup.find('p'))
# 通过类名来查找节点
print(soup.find('p',attrs={'class':"story"}))
print(soup.find('p',class_="story"))
# 通过id来查找节点
print(soup.find('p',id="story"))

3.2通过find_all()来查找

#查找全部
# find_all
'''
 参数:name=None, attrs={}, recursive=True, 
 text=None,limit=None, **kwargs
'''
# 查找所有符合的标签,返回一个列表
print(soup.find_all('p'))
# 限制输出
print(soup.find_all('a',limit=2))
# 使用正则
print(soup.find_all(re.compile('^p')))
print(soup.find_all(text=re.compile("^L")))

3.3 通过select()来查找

# css选择器
# 查找id为story下的a(子孙节点)
print(soup.select("#story a"))
# 查找id为story下的子节点下的a(子节点)
print(soup.select("#story > i > a"))

猜你喜欢

转载自blog.csdn.net/ydw_ydw/article/details/82155894
今日推荐