数据解析的原理:

  1. 标签定位
  2. 提取标签、标签属性中储存的值

1. 正则表达式

基本符号

·:表示除换行之外所有字符,仅表示单个字符
如:”regular” 可以表示为re...ar
*:表示前一个表达式0次或无限次
?:表示前一个表达式0次或1次
\d:digital-表示一位数字
():提取括号里的内容
“.*”:贪婪模式,获取最长的满足条件的字符串。
“.*? ”:非贪婪模式,获取最短的能满足条件的字符串。

findall()

  1. re.findall(pattern, string, flags=0)# pattern:模式

以列表形式返回所有满足要求的字符串,如果没有匹配到结果,就会返回空列表
多个“(.*? )”返回的仍然是一个列表,但是列表里面的元素变为了元组

  1. re.findall('账号是:(.*?), 密码是:(.*?)', text, re.S)
  2. >>>[('kingname', '123456'), ('shin', '27743')...]

re.S”:忽略换行符

search()

只会返回第1个满足要求的字符串。一旦找到符合要求的内容,它就会停止查找。
匹配成功,则是一个正则表达式的对象;如果没有匹配到任何数据,就是None。
通过.group()这个方法来获取里面的值,.group()里面的参数为1表示读取第1个括号中的内容,参数为2表示读取第2个括号中的内容,以此类推

2. XPath

XPath解析原理:

  1. 实例化一个etree的对象并将要解析的数据加载
  2. 调用etree对象中的XPath方法结合XPath表达式实现标签的定位和内容的捕获

    环境安装

    1. pip install lxml

    语法

    ```python

    ——-Xpath解析步骤——-

1.导入模块

from lxml import etree

2.实例化etree对象

-01.调用本地HTML数据

tree = etree.parse(filePath)

-02.调用网络HTML数据

tree = etree.HTML(response.text)

3.Xpath语法

01.定位

- /:表示从根节点开始定位,一个/表示一个层级

tree.xpath(‘/html’) # html根标签

- ./:表示当前层级

tree.xpath(‘./a’) # 当前层级下的a标签

- //:表示从任意位置开始定位

tree.xpath(‘//div/a’) # div下的a标签

- 属性定位:标签名[@属性名=”属性值”]

tree.xpath(‘//div/a[@class=’nav’])

- 定位某个字符开头属性名的标签:starts-with()

tree.xpath(‘//div[starts-with(@class, “nav”)]’) # 获取所有的以class属性为”nav”开头的div,如”nav1”、”naviss”

- 定位属性值包含部分相同属性名的标签:contains()

tree.xpath(‘//div[contains(@class, “top”)’) # 获取所有的class属性包含”top”的div,如”sstop”、”topss”、”stops”

- 选取前几个或者后几个标签:position()

tree.xpath(‘//ul[@id=’top’]/li[position()<4]) # 定位选取前3个li标签

- 索引定位:标签名[索引] 注意这里的索引从1开始

tree.xpath(‘//ul/li[3]’) # 第三个li

02.获取数据

- 获取文本:text()

tree.xpath(‘//ul/li/text()’) # 获取li标签下的所有文本内容,是一个列表

- 获取属性:@属性名

tree.xpath(‘//ul/li/a/@href’) # 获取a标签下的所有href属性,是一个列表

  1. <a name="923e3c62"></a>
  2. # 3. parsel模块
  3. pass
  4. <a name="9eee1105"></a>
  5. # 4. Beautiful Soup4
  6. <a name="e655a410"></a>
  7. ## 安装
  8. ```shell
  9. pip install beautifulsoup4

bs4数据解析的步骤:

  1. 实例化一个BeautifulSoup对象,并且将页面数据加载到该对象
  2. 通过调用BeautifulSoup对象中的属性或者方法进行标签定位和数据提取 ```python

    ———bs4解析步骤——-

1.导入模块

from bs4 import BeautifulSoup

2.实例化BeautifulSoup对象

soup = BeautifulSoup(response.text, ‘lxml’)

3.bs4语法

01.定位

- soup.TagName:返回第一个标签对象

soup.a

- soup.find(‘TagName’):返回第一个标签对象

soup.find(‘div’)

- soup.find(‘TagName’, 属性名=’值’):返回第一个此属性的对象

soup.find(‘div’, class/id…=’nav’) # 因为这里的属性和xpath不一样不使用@所以class要加符号,不然和类中的class冲突了

- soup.find_all():返回所有符合要求的对象(列表)

soup.findall(‘div’) soup.find_all(‘div’, class/id…=’nav’)

- soup.select(‘选择器/层级选择器’):返回所有符合要求的对象(列表)

soup.select(‘.nav’) soup.select(‘ul li’)

02.获取数据

- 获取标签之间的文本数据

- soup.TagName.text/get_text():可以获取一个标签中所有的文本内容

soup.a.text soup.a.get_text()

- soup.TagName.string:只可以获取该标签下面直系的文本内容

soup.a.string

- 获取标签中属性值

soup.TagName[‘属性名’]

soup.a[‘href’] ```

find()与find_all区别

  • find_all()返回的是BeautifulSoup Tag对象组成的列表,如果没有找到符合要求的标签则返回空列表
  • find()返回的是一个BeautifulSoup Tag对象,如果有多个符合条件的标签,则返回第1个,找不到则返回None