数据解析
  3XDZIv8qh70z 2023年11月02日 40 0
在最近学习中我们学习了两种解析方法,分别是正则表达式的re解析与BeautifulSoup解析器的使用

一、正则表达式

正则表达式是用来避免重复工作,处理有规律信息的一个有力工具

import re
text = "Hi, I am Shirley Hilton. I am his wife."
m = re.findall(r"hi", text)
if m:
    print (m)
else:
    print ('not match')
这是一个小实验,通过它来看,我们不难看出这是在通过某种方法寻找"Hi, I am Shirley Hilton. I am his wife."这段话中的"hi"通过这个我们发现会有两个结果,都是hi,分别来自于Shirly与his俩单词,由此我们看出,正则表达式是严格的,区分大小写的,Hi并不满足要求。
当然,不仅仅有这样的查找,也可以仅仅找部分的,比如只匹配“Hi”,在这段话中只想要计数一次,那么我们可以采用"\bHi\b"的查找对象,这样就能仅仅匹配单独的Hi啦。
“\b”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。而“\b”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前后的空格标点之类不会出现在结果里。
然后[]符号的作用也很大,它的作用是表示满足括号中任一字符,例如我们想要Hi也想要hi,就可以[Hh]i

r

接下来继续解释这个小试验中的内容,在语句传参时的r的含义,为什么要加r? r,是raw的意思,它表示对字符串不进行转义。例如:
>>> print ("\bhi")
hi
>>> print (r"\bhi")
\bhi

re

re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。
特殊字符
这里介绍

.

除换行符以外的任意字符

\S

不是空白符的任意字符

*

表示前面的字符可以重复任意多次(包括0次)

+

表示前面的字符可以重复任意多次(不包括0次)

{}

表示指定长度

[]

[]内任意字符

\w

匹配字母或数字或下划线或汉字

\d

匹配数字

\s

匹配空白符

^

匹配字符串的开始

$

匹配字符串的结束

?

重复零次或一次(懒惰匹配)

{n,}

重复n次或更多次

{n,m}

重复n到m次

很容易猜想到,如\s\S这样大小写的区分就是正反的区别,由此推出各个对应的相反,此外,[^]内通过加^就代表除此符号外任意字符

.*

贪婪匹配

/*?

懒惰匹配

二、BeautifulSoup解析器

[1]简介

Beautiful Soup是Python的一个库,能够从网页抓取数据提供了一些函数用来处理数据,用很少的代码就能够写出来一个完整的程序。

[2]特点

Beautiful Soup能够自动的将文档转换为utf-8编码格式,能够更为方便的进行使用

使用

[1]创建对象

要想创建一个Beautiful Soup对象,首先要导入库bs4,lxml,requests。

这里使用一个实例

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html,'lxml')  #创建 beautifulsoup 对象

同时也可以使用HTML文件直接创建对象

soup1 = BeautifulSoup(open('index.html'))
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

1>Tag

Tag就是 HTML 中的一个个标签

通过这种方法就可以直接访问标签

print (soup.title)
print (soup.head)
print (soup.a)
print (soup.p)
print (type(soup.a))

Tag有两个重要的属性,name与attrs

并且可以对这些属性和内容进行修改

2>NavigableString

得到了标签的内容用 .string 即可获取标签内部的文字

例如

print(soup.a.string)

3>BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称:

4>Comment

[2]遍历文档树

tag 的 .contents 属性可以将tag的子节点以列表的方式输出

.children属性生成的是一个列表生成器对象,可以通过遍历获得其中的内容

.descendants 属性可以对所有tag的子孙节点进行递归循环,和 children类似,要获取其中的内容,我们需要对其进行遍历

还有许多关联选择方法

[3]CSS选择器

CSS的使用只需要调用select方法结合CSS选择器语法就可以实现元素定位

格式:soup.select()

1>id选择器

每段节点都有专属的id,通过id就可以匹配相应的节点,使用#加id就可以实现定位

2>类选择器

类选择器用.来定位元素

例如<p class="title" name="dromouse">The Dormouse's story</p>中的title就是类名

3>标签选择器

直接使用标签来定位即可例如p

在定位时可以多种定位方法混合使用,达到更为理想的效果。

[4]CSS高级用法

1>嵌套选择

因为其仍旧是一个tag对象,所以可以使用嵌套选择

2>属性获取

使用attrs属性

3>文本获取

使用string与strings获取文本信息

[5]方法选择器

1>find_all()方法

soup传入整个HTML文档然后进行全文搜索

find_all(name,attrs,recursive,text,**kwargs)

name参数就是查找名字为name的节点,返回tag对象,这个传入的参数可以是字符串,可以是列表,正则,还可以是True(以此为参数可以获取所有的标签)

attrs参数是查询含有接受的属性值的标签,参数形式为字典类型例如{id:'link1'}

kwargs参数是接收常用的属性参数的,如id和class,参数形式是变量赋值的形式,例如(id='link1') class 是关键字,使用时应该加下划线即class_=……

text参数是通过查询含有接受的文本的标签来查找的,参数形式是字符串

limit参数是用于限制返回结果的数量的参数,参数形式是整数,顾名思义

recursive参数是决定是否获取子孙节点的参数,参数形式是布尔值,默认是True

2>find方法

返回值是第一个符合条件的元素,除limit参数不存在外,其余参数都与find_all方法一致

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
3XDZIv8qh70z
作者其他文章 更多