python 数据分析之 HTML文件解析

这篇具有很好参考价值的文章主要介绍了python 数据分析之 HTML文件解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 :Html

1. Html 理解

HTML 是用来描述网页的一种语言。HTML 是一种在 Web 上使用的通用标记语言。HTML 允许你格式化文本,添加图片,创建链接、输入表单、框架和表格等等,并可将之存为文本文件,浏览器即可读取和显示。

HTML 指的是超文本标记语言: HyperText Markup Language
HTML 不是一种编程语言,而是一种标记语言
标记语言是一套标记标签 (markup tag)
HTML 使用标记标签来描述网页
HTML 文档包含了HTML 标签及文本内容
HTML文档也叫做 web 页面

2. Html 介绍

HTML:是 Hypertext Marked Language,即超文本标记语言,是一种用来制作超文本文档的简单标记语言;
HTTP超文本传输协议规定了浏览器在运行 HTML 文档时所遵循的规则和进行的操作。HTTP协议的制定使浏览器在运行超文本时有了统一的规则和标准。
HTML文件本质上是文本文件,而普通的文本文件只能显示字符。但是HTML技术则通过HTML标签把其他网页、图片、音频、视频等各种多媒体资源引入到当前网页中,让网页有了非常丰富的呈现方式,这就是超文本的含义——本身是文本,但是呈现出来的最终效果超越了文本。

3. Html 构成

html开发,本质上就是编写一个.html格式的文档,最终通过浏览器执行该文档,一个html文档中包含三部分:HTML部分、HTML部分、JS部分

Html组成 含义
HTML部分 HTML:hyper text markup language;hyper text:超文本,是指写在html文档中,并在网络上传输的 文字、图片、视频、音频;markup language:标记语言 。所谓标记:就是指由一对尖括号扩起来,当中具有特定英文单词的标识。标记的其他叫法:标签 元素 element。
CSS部分 CSS:cascading style sheet 层叠样式表;用来对文档中的标签设置样式,从而改变超文本在浏览器上的渲染效果
JS部分 JS:javaScript;运行在浏览器端的脚本语言。平时我们看到网页,除了可以看以外,还可以处理一些用 户的交互行为,例如:鼠标的点击,键盘的控制等等。这些功能需要通过JS来完成

html文档中只有两种类型的标记

html文档标记类型 含义
单标记 不能存放内容,多是一些功能性的标记
双标记 有开始有结束,主要功能是存放内容,可以是超文本, 也可以是其他标记

4. HTML结构 介绍

1> HTML文件结构

A: 文档类型声明

写在html文档的第一行是文档中唯一个非标签字符,起文档说明作用,用来告知浏览器,当前文档是一 个支持html5标准的文档,不可省略,其中最重要的就是当前HTML文档遵循的语法标准。

HTML4版本的文档类型声明是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

HTML5版本的文档类型声明是:

<!DOCTYPE html>
B: 根标签

html标签是整个文档的根标签,所有其他标签都必须放在html标签里面。上面的文档类型不能当做普通标签看待。该标签包含两个子标签:head 和 body

C: 头部 -head 元素

head标签用于定义文档的头部,其他头部元素都放在head标签里。头部元素包括title标签、script标签、style标签、link标签、meta标签等等。

D: title 标签

作用:设置文档的标题或者名称。浏览器通常将该标签的内容显示在窗口顶部或者标签页上。每个 HTML 文档只能有一个,必须有一个 title 标签。

E: meta 标签

<metacharset=“UTF-8”> 声明字符的编码格式为 utf-8

F: 主体-body 标签

body标签定义网页的主体内容,在浏览器窗口内显示的内容都定义到body标签内;也就是我们的主要内容(比如文本、超链接、图像、表格和列表等)
E: 注释
描述当前代码功能,代码信息 、编写日期、作者 、维护日期、维护者

HTML注释的写法是:

<!-- 注释内容 -->

F: demo

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Html test</title>
</head>
<body>
 
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
 
</body>
</html>
===================================
<!DOCTYPE html> 声明为 HTML5 文档
<html> 元素是 HTML 页面的根元素
<head> 元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8(由于在大部分浏览器中直接输出中文会出现乱码,所以要在头部将字符声明为UTF-8)
<title> 元素描述了文档的标题
<body> 元素包含了可见的页面内容
<h1> 元素定义一个大标题
<p> 元素定义一个段落

2> 各部分详解

A: 标题

HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Html test</title>
</head>
<body>
 
<h1>我的第一个标题</h1>
<h1>我的第二个标题</h1>
<h1>我的第三个标题</h1>
 
</body>
</html>
B: 段落

HTML 段落是通过标签 <p> 来定义的

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Html test</title>
</head>
<body>
 
<p>这是一个段落。</p>
<p>这是一个段落。</p>
<p>这是一个段落。</p>

 
</body>
</html>
C: 链接

HTML 链接是通过标签 <a> 来定义的

<body>
 
<a href="https://blog.csdn.net/zong596568821xp">这是一个链接使用了 href 属性</a>
 
</body>

D: 图像

HTML 图像是通过标签 来定义的。注意: 图像的名称和尺寸是以属性的形式提供的。

<body>
 
<img src="zongxp.jpg" width="640" height="640" />
 
</body>

E: 表格

表格由 <table> 标签来定义。每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> 标签定义)。字母 td 指表格数据(table data),即数据单元格的内容。数据单元格可以包含文本、图片、列表、段落、表单、水平线、表格等等。表格的表头使用 <th> 标签进行定义。如果不定义边框属性,表格将不显示边框。有时这很有用,但是大多数时候,我们希望显示边框。使用边框属性来显示一个带有边框的表格:

<table border="1">
    <tr>
        <th>Header 1</th>
        <th>Header 2</th>
    </tr>
    <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
    </tr>
    <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
    </tr>
</table>

3> 列表速查

A: 基本文档
<!DOCTYPE html>
<html>
<head>
<title>文档标题</title>
</head>
<body>
可见文本...
</body>
</html>
B: 基本标签

h1-h6 块元素 独立成行 行间距
属性:
align
对齐方式 left center right

color
不存在 如果需要设置样式 要嵌套font标签

<h1>最大的标题</h1>
<h2> . . . </h2>
<h3> . . . </h3>
<h4> . . . </h4>
<h5> . . . </h5>
 <h1 align="center">我是标题1</h1>
 
<p>这是一个段落。</p>
<br> (换行)
<hr> (水平线)
<!-- 这是注释 -->
C: 文本格式化
<b>粗体文本</b>
<code>计算机代码</code>
<em>强调文本</em>
<i>斜体文本</i>
<kbd>键盘输入</kbd> 
<pre>预格式化文本</pre>
<small>更小的文本</small>
<strong>重要的文本</strong>
 
<abbr> (缩写)
<address> (联系信息)
<bdo> (文字方向)
<blockquote> (从另一个源引用的部分)
<cite> (工作的名称)
<del> (删除的文本)
<ins> (插入的文本)
<sub> (下标文本)
<sup> (上标文本)
D: 链接
普通的链接:<a href="http://www.example.com/">链接文本</a>
图像链接: <a href="http://www.example.com/"><img src="URL" alt="替换文本"></a>
邮件链接: <a href="mailto:webmaster@example.com">发送e-mail</a>
书签:
<a id="tips">提示部分</a>
<a href="#tips">跳到提示部分</a>
E: 图片
<img src="URL" alt="替换文本" height="42" width="42">
F: 样式/区块
<style type="text/css">
h1 {color:red;}
p {color:blue;}
</style>
<div>文档中的块级元素</div>
<span>文档中的内联元素</span>
G: 列表

无序列表

<ul>
    <li>项目</li>
    <li>项目</li>
</ul>

有序列表

<ol>
    <li>第一项</li>
    <li>第二项</li>
</ol>
H: 定义列表
<dl>
  <dt>项目 1</dt>
    <dd>描述项目 1</dd>
  <dt>项目 2</dt>
    <dd>描述项目 2</dd>
</dl>
I: 表格
<table border="1">
  <tr>`<form action="demo_form.php" method="post/get">
<input type="text" name="email" size="40" maxlength="50">
<input type="password">
<input type="checkbox" checked="checked">
<input type="radio" checked="checked">
<input type="submit" value="Send">
<input type="reset">
<input type="hidden">
<select>
<option>苹果</option>
<option selected="selected">香蕉</option>
<option>樱桃</option>
</select>
<textarea name="comment" rows="60" cols="20"></textarea>
 
</form>`
    <th>表格标题</th>
    <th>表格标题</th>
  </tr>
  <tr>
    <td>表格数据</td>
    <td>表格数据</td>
  </tr>
</table>
J: 框架
<iframe src="demo_iframe.htm"></iframe>
K: 实体
&lt; 等同于 <
&gt; 等同于 >
&#169; 等同于 ©

M: 文本修饰

font 行内标签
属性:
size
字体大小 最大值是7

color
颜色值 颜色单词 red green blue 颜色的RGB rgb(0,0,255)
十六进制表示 #0000ff

face
字体族 黑体 楷体 宋体 华文彩云 必须浏览器支持

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

     <font size="7" color="red" face="华文彩云">主题内容。</font>
&nbsp;&nbsp;&nbsp;&nbsp;我还是主体内容
<br><br><br><br><br>
</body>

5> HTML语法基本规则

序列 规则内容
1 根标签有且只能有一个
2 标签可以嵌套但不能交叉嵌套
3 注释不能嵌套
4 属性必须有值,值必须加引号,单引号或双引号均可
5 标签名不区分大小写但建议使用小写

6> Htlm特点

序列 内容
1 使用是一对一对的标签组成;双标签 可以嵌套其他标签
2 标签之间可以相互嵌套,但是不可以交叉嵌套;<tag1><tag2></tag2></tag1>;<tag1></tag1><tag2></tag2>;
3 使用属性去区分标签不同; <person id=“2015105393xxxx” name=“xiaohe”>;<person id=“2015105394yyyy” name=“xiaohe”>

二: python 对Html 文件分析

1. BeautifulSoup

在使用BeautiSoup对其进行解析,解析的时候要使用相应类型的解析器html.parser

from bs4 import BeautifulSoup

file = open(r'C:/Users/CHH_PC/Desktop/test.html','rb')
html = file.read()
bs = BeautifulSoup(html,'html.parser')

BeautifulSoup 将复杂的HTML文档转换成一个复杂的树形结构,每个结点都是一个Python对象,所有对象可以分为四种:

对象 含义
Tag 标签及其内容:拿到它所找到的第一个内容;
NavigableString 这个内容就是NavigableString(标签里的内容,string)
BeautifulSoup 表示对整个文档的访问
Comment 是一个特殊的NavigableString,输出内容不包括注释符号

2. BeautifulSoup应用

1> 常用参数

用法 解释
bs.title Tag 标签及其内容:拿到它所找到的第一个内容
bs.title.string 只获得标签的内容,不要标签
bs.a.attrs 快速拿到标签里面的所有属性
bs.NavigableString NavigableString用.string获取标签内部的文字。
bs…head 获取head标签的所有内容
bs.head.contents head文档的遍历
bs.body.contents body文档的遍历
bs.body.contents[1] body中第一个文档的遍历;content可遍历的内容有很多,获取Tag所有的子节点,返回一个list;contents[1] 用列表索引获取它的某一个元素
bs…prettify() 获取HTML的缩进格式
bs…title 获取title标签的所有内容
bs.title.name 获取title标签的名称
bs.title.string 获取title的文本内容
bs.div 获取第一个div标签中的所有内容
bs.div[‘id’] 获取第一个div标签的id的值
bs.a 获取第一个a标签中的所有内容
bs.find_all(‘a’) 获取所有的a标签中的所有内容

2> 遍历文档树

其他参数 demo
children for child in bs.body.contents[9].children: print(child);hildren 获取 Tag 所有的子节点,返回一个 生成器
.descsndants 获取 Tag 所有的子孙节点
.strings 如果Tag包含多个字符串,即在子孙节点中,可以用此获取,再进行遍历;
.striped_strings 与strings 用法一致,清除多余的空白字符串;for child in bs.body.contents[9].stripped_strings: print(child)
.parent 获取Tag 父节点
.parents 递归得到父辈元素的所有节点,返回一个生成器;
.previous_sibling 获取当前Tag上一个节点,属性通常是字符串或者空白,真实结果其实是当前标签与上一个标签之间的顿号与换行符;
.next_sibling 获取当前Tag下一个节点,属性通常是字符串或者空白,真实结果其实是当前标签与下一个标签之间的顿号与换行符;
.previous_siblings 获取当前Tag上面所有的兄弟节点,返回一个生成器;
.next_siblings 获取当前Tag下面所有的兄弟节点,返回一个生成器;
.previous_element 获取解析过程中上一个被解析的对象,可能与previous_sibling相同,但通常都不同,
.next_element 获取解析过程中下一个被解析的对象,可能与previous_sibling相同,但通常都不同;
.previous_elements 返回一个生成器,可以向前访问文档的解析内容;
.next_elements 返回一个生成器,可以向后访问文档的解析内容;

3> 文档的搜索

参数 含义
find_all() divs_bs = bs.find_all(‘div’) print(divs_bs)找到所有的列标签,统一放到divs_bs ;也可以编译一个find_all(re.compile(‘a’))对象,然后find_all其中的内容
kwargs(参数) divs_bs = bs.find_all( id=“wp”)或者 divs_bs = bs.find_all(‘div’, id=“wp”) 再进行遍历
text divs_bs = bs.find_all( text=“请输入搜索内容”);其他属性divs_bs = bs.find_all( value=“请输入搜索内容”)
limit divs_bs = bs.find_all(‘div’, limit=1) print(divs_bs);输出一个div信息
css选择器 含义
titlehead\body divs_bs = bs.select(‘title’) 通过title查询;
# divs_bs = bs.select(“#toptb”) 加# 通过ID查找
. divs_bs = bs.select(“.pg_index”) 加 . 通过类名查找
head > title divs_bs = bs.select(‘head > title’) 通过子标签查询;
a ivs_bs = bs.select(“a[class=‘sister’]”) 按照属性查找

4> BeautifulSoup解析器

解析器 语法 优势 劣势
Python标准库 BeautifulSoup(html, ‘html.parser’) Python的内置标准、执行速度适中、文档容错能力强 Python2.7.3及Python3.2.2之前的版本文档容错能力差
lxml HTML解析库 BeautifulSoup(html, ‘lxml’) 速度快、文档容错能力强 需要安装C语言库
lxml XML解析库 BeautifulSoup(html, ‘xml’) 速度快、唯一支持XML的解析器 速度快、唯一支持XML的解析器
html5lib解析库 BeautifulSoup(html, ‘html5lib’) 最好的容错性、以浏览器的方式解析文档,生成HTMLS格式的文档 速度慢、不依赖外部扩展

例如:
soup = BeautifulSoup(html, ‘lxml’)创建对象
soup = BeautifulSoup(open(‘test.html’),‘lxml’)读取HTML文件

5> BeautifulSoup 高阶

A: find_all 参数举例
举例 含义
soup.find_all(‘a’) 查找与字符串完整匹配的内容,用于查找文档中所有的<a>标签
soup.find_all(re.compile(‘^b’)) 传入正则表达式,BeautifulSoup会通过正则表达式的match()来匹配内容。返回所有表示<body>和<b>标签。
soup.find_all([‘p’,‘a’]) 传入列表参数,BeautifulSoup会与列表中任一元素匹配的内容返回。返回所有的<p>和<a>标签
soup.find_all(text=re.compile(‘^b’)) 匹配正则表达式
soup.find_all(传方法) soup.find_all(test_def);def test_def: return tag.has_attr(“class”) 此处传参方法,判断标签是否含有class信息

三:urllib.requests

1. urllib库的作用-解析网页

作用:urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象。可以使用代码模拟浏览器发起请求
urllib 是python3 的内置库,urllib库最大的作用就是可以去设定相关的头部信息然后和网站建立请求连接,请求连接建立完成后就能够去获取到网页的整体数据,这也是python爬虫脚本实现的核心

2. urllib子模块

urllib模块包括:urllib.request, urllib.error, urllib.parse,urllib.robotparser

子模块 解释
urllib.request 请求模块-可以用来发送request和获取request的结果
urllib.error 异常处理模块-包含了urllib.request产生的异常
urllib.parse url解析模块-用来解析和处理URL
urllib.robotparser robots.txt解析模块-用来解析页面的robots.txt文件

模拟请求使用的最主要的库便是urllib.request,异常处理用urllib.error库

3. 使用流程

序列 步骤
1 指定url
2 发起请求:针对指定的url发起一个请求
3 获取页面数据:获取服务器响应回来的页面数据
4 持久化存储

4. urllib.request 发送请求

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容
demo

1> demo

import urllib.request
response = urllib.request.urlopen("https://www.baidu.com")
print(response)
====================
<http.client.HTTPResponse object at 0x00000296F6B89B88>
返回一个一个 HTTPResposne 类型的对象,它包含方法有 read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性,所以可以通过response 调用这些方法和属性

2> 函数

函数 含义
response.status 返回结果的状态码,如200代表请求成功,404代表网页未找到等
response.getheaders() 返回list 格式head 信息
response.getheader(“Server”) 查询具体信息
response.read() 读取返回信息

5. urllib.request.urlopen()

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None)
属性 理解
data 参数是可选的;如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST
timeout timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP 、 HTTPS 、 FTP 请求
cafile 和 capath 两个参数是指定CA证书和它的路径,这个在请求 HTTPS 链接时会有用
cadefault 参数现在已经弃用了,默认为 False

1> data

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding=
'utf8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read().decode()) # 把bety转换为字典形式数据
========================
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "word": "hello"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "10", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.7", 
    "X-Amzn-Trace-Id": "Root=1-63f61236-4616d33d219931e3332ba8b5"
  }, 
  "json": null, 
  "origin": "117.143.152.208", 
  "url": "http://httpbin.org/post"
}

POST 请求:
这里我们传递了一个参数 word ,值是 hello 。它需要被转码成 bytes (字节流)类型。其中转字节流采用了 bytes() 方法;
第一个参数需要是 str (字符串)类型,需要用 urllib.parse.urlencode() 方法来将参数字典转化为字符串。
第二个参数指定编码格式,在这里指定为 utf8

2> timeout

import urllib.request
response = urllib.request.urlopen("https://www.baidu.com/?tn=65081411_1_oem_dg",timeout=1)
print(response.read().decode())

设置了超时时间是1秒,程序1秒过后服务器依然没有响应,于是抛出了 urllib.error.URLError: 异常,错误原因是 timed out;因此我们可以通过设置这个超时时间来控制一个网页如果长时间未响应就跳过它的抓取,利用 try,except 语句就可以实现这样的操作

import urllib.request
import  socket
import urllib.error
try:
    response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
except urllib.error.URLError as e:
    if  isinstance(e.reason, socket.timeout):
            print("Time out!")

3> Request

1. Request 详解
import urllib.request
request = urllib.request.Request("https://www.baidu.com")
response = urllib.request.urlopen(request)
print(response.read().decode("utf-8"))

依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个URL,而是一个 Request ,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加
丰富和灵活

def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):
参数 含义
url 参数是请求链接,这个是必传参数,其他的都是可选参数
data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用 urllib.parse.urlencode() 编码。
headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header() 方法来添加请求头。请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib ,你可以通过修改它来伪装浏览器,比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)Gecko/20071127 Firefox/2.0.0.11
origin_req_host 指的是请求方的 host 名称或者 IP 地址
unverifiable 指的是这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True
method 是一个字符串,它用来指示请求使用的方法,比如 GET , POST , PUT 等等
2. 传入多个参数构建一个 Request

通过四个参数构造了一个 Request , url 即请求链接,在 headers 中指定了 User-Agent 和 Host ,传递的参数 data 用了 urlencode() 和 bytes() 方法来转成字节流,另外指定了请求方式为 POST

from urllib import request,parse
url = "http://httpbin.org/post"
headers = {
    #伪装一个火狐浏览器
    "User-Agent":'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    "host":'httpbin.org'
}
dict = {
    "name":"Germey"
}
data = bytes(parse.urlencode(dict),encoding="utf8")
req = request.Request(url=url,data=data,headers=headers,method="POST")
response = request.urlopen(req)
print(response.read().decode("utf-8"))
==========================

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "Germey"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)", 
    "X-Amzn-Trace-Id": "Root=1-63f61795-1ff741e6101a79d9442e056c"
  }, 
  "json": null, 
  "origin": "117.143.152.208", 
  "url": "http://httpbin.org/post"
}


Process finished with exit code 0

headers 也可以用 add_header() 方法来添加。

req = request.Request(url=url, data=data, method=‘POST’)
req.add_header(‘User-Agent’, ‘Mozilla/4.0 (compatible; MSIE 5.5;Windows NT)’)

如此一来,我们就可以更加方便地构造一个 Request ,实现请求的发送

6. urllib.request高级特性

虽然可以构造 Request ,但是一些更高级的操作,比如 Cookies 处理,代理该怎样来设置?需要更强大的工具 Handler ;
简而言之你可以把它理解为各种处理器,有专门处理登录验证的,有处理 Cookies 的,有处理代理设置的,利用它们我们几乎可以做到任何 HTTP 请求中所有的事情

1> urllib.request.BaseHandler

它是所有其他 Handler 的父类,它提供了最基本的 Handler 的方法,例
如 default_open() 、 protocol_request() 等

BaseHandler 子类 含义
HTTPDefaultErrorHandler 用于处理HTTP响应错误,错误都会抛出 HTTPError 类型的异常
HTTPRedirectHandler 用于处理重定向
HTTPCookieProcessor 用于处理 Cookie
ProxyHandler 用于设置代理,默认代理为空
HTTPPasswordMgr 用于管理密码,它维护了用户名密码的表
HTTPBasicAuthHandler 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题

实例代码1

import urllib.request
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
                          uri='https://mahler:8092/site-updates.py',
                          user='klem',
                          passwd='kadidd!ehopper')
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
urllib.request.urlopen('http://www.example.com/login.html'
=============================
说明 Handler 和 Opener 的使用方法。在这里,首先实例化了一个 HTTPBasicAuthHandler 对象,利用 add_password() 添加进去用户名和密码,相当于建立了一个处理认证的处理器;接下来利用 urllib.request.build_opener() 方法来利用这个处理器构建一个 Opener ,那么这个 Opener 在发送请求的时候就具备了认证功能了。接下来利用 Opener 的 open() 方法打开链接,就可以完成认证了

实例代码2
代理

import urllib.request
proxy_handler = urllib.request.ProxyHandler({
'http': 'http://218.202.111.10:80',
'https': 'https://180.250.163.34:8888'
})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('https://www.baidu.com')
print(response.read())
=============================
用于说明代理的设置方法,代理可能已经失效。

在这里使用了 ProxyHandler , ProxyHandler 的参数是一个字典,key是协议类型,比如 http 还是 https 等,value是代理链接,可以添加多个代理。
然后利用 build_opener() 方法利用这个 Handler 构造一个 Opener ,然后发送请求即可

2> Cookie设置

获取网站的 Cookie

import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar() 或则cookie = http.cookiejar.LWPCookieJar(filename)# LWPCookieJar ,同样可以读取和保存 Cookie ,但是保存的格式和 MozillaCookieJar 的不一样,它会保存成与libwww-perl的Set-Cookie3文件格式的 Cookie
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
   print(item.name+"="+item.value)
========================
打印
BAIDUID=8D12919D30F39DFDD8FC36AC5F965BD4:FG=1
BIDUPSID=8D12919D30F39DFDD1ED7D576F0628B2
H_PS_PSSID=36561_38129_37906_37861_38264_38173_38289_38243_38034_38263_37928_38285_26350_22157_37881
PSTM=1678009542
BDSVRTM=0
BD_HOME=1
===============================================
首先必须声明一个 CookieJar 对象,接下来我们就需要利用 HTTPCookieProcessor 来构建一个 handler ,最后利用 build_opener 方法构建出 opener ,执行 open() 即可

Cookie 实际也是以文本形式保存

filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)
===================
这时的 CookieJar 就需要换成 MozillaCookieJar ,生成文件时需要用到它,它是 CookieJar 的子类,可以用来处理 Cookie 和文件相关的事件,读取和保存 Cookie ,它可以将 Cookie 保存成 Mozilla 型的格式;运行之后可以发现生成了一个 cookie.txt 文件

从文件读取并利用Cookie 信息

cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
===========================
利用上面的方式生成了 LWPCookieJar 格式的 Cookie ,然后利用 load() 方法,传入文件名称,后面同样的方法构建 handler 和 opener 即可

四 : python 数据分析之 xlsxwriter文件解析

python 数据分析之 xlsxwriter文件解析
https://blog.csdn.net/weixin_42914706/article/details/129116587文章来源地址https://www.toymoban.com/news/detail-595830.html

到了这里,关于python 数据分析之 HTML文件解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【头歌】——数据分析与实践-python-网络爬虫-Scrapy爬虫基础-网页数据解析-requests 爬虫-JSON基础

    第1关 爬取网页的表格信息 第2关 爬取表格中指定单元格的信息 第3关 将单元格的信息保存到列表并排序 第4关 爬取div标签的信息 第5关 爬取单页多个div标签的信息 第6关 爬取多个网页的多个div标签的信息 第1关 Scarpy安装与项目创建 第2关 Scrapy核心原理 第1关 XPath解析网页 第

    2024年01月22日
    浏览(59)
  • Python数据分析(四)-- 操作Excel文件

            在实际生产中,经常会用到excel来处理数据,虽然excel有强大的公式,但是很多工作也只能半自动化,配合Python使用可以自动化部分日常工作,大大提升工作效率。 openpyxl :只允许读取和写入.xlsx格式文件并进行增删改增查。 xlwings :允许读取和写入.xlsx和.xls两种

    2024年02月06日
    浏览(51)
  • 使用lxml解析本地html文件报错?

    使用 lxml 中的 parse 方法读取本地 html 文件报错,遇到这种问题该怎么解决呢? 报错: 根据报错信息,看起来是在解析HTML文件时出现了语法错误。具体错误是在test.html文件的第83行,link标签的开启和结束标签不匹配。 这个错误可能是由于HTML文件本身存在语法问题导致的。你

    2024年02月04日
    浏览(41)
  • python解析本地html方法

    Python爬虫每次运行时都会访问一次主机,为了避免增加主机访问负荷,一般都是在本地解析。Python解析本地html文件方法如下: 1.将html文件本地保存 2.在Python中打开html文件,可使用BeautifulSoup方法直接打开 3.获取本地文件资料 a.先爬取主页的列表资料,其中同义内容使用“@”

    2024年02月14日
    浏览(43)
  • python解析html基础操作

    目录 一、前提 二、html内容转换 三、元素的获取 1.获取html所有标签节点 2.查找指定标签的所有节点 3.查找指定属性名称的节点 4.查找指定标签名称的内容 5.查找指定标签的父节点 6.查找指定标签的所有属性的值 7.查找指定标签和属性的节点 8.查找指定标签,属性和属性值的节

    2024年02月09日
    浏览(38)
  • 【头歌】——数据分析与实践-基于Python语言的文件与文件夹管理-文本 文件处理-利用csv模块进行csv文件的读写操作

    第1关 创建子文件夹 第2关 删除带有只读属性的文件 第3关 批量复制文件夹中的所有文件 未通过本题,如果您通过了本题欢迎补充到评论区,有时间我会整理进来 第1关 读取宋词文件,根据词人建立多个文件 第2关 读取宋词文件,并根据词人建立多个文件夹 第3关 读取宋词文

    2024年01月25日
    浏览(73)
  • 运用Python解析HTML页面获取资料

    在网络爬虫的应用中,我们经常需要从HTML页面中提取图片、音频和文字资源。本文将介绍如何使用Python的requests库和BeautifulSoup解析HTML页面,获取这些资源。 一、环境准备 首先,确保您已经安装了Python环境。接下来,我们需要安装以下库: requests :用于发送HTTP请求 Beautifu

    2024年02月11日
    浏览(39)
  • 使用bs4 分析html文件

    首先需要 pip install beautifulsoup4 安装 然后为了方便学习此插件,随便打开一个网页,然后鼠标右键,打开源网页,如下图片 这样就可以获得一个网页源码,全选复制粘贴到本地,存储为 .html 文件,后续的学习以此html文件为模版进行 如,html文件中含结构 我使用如下命令: 例

    2024年01月17日
    浏览(50)
  • 【一种使用浏览器读取本地excel、josn等数据文件的方法】Python+JavaScript+HTML实现

    一般来说,为了网络访问安全,浏览器是不能直接加载本地文件的,IE内核的浏览器提供了AX控件实现本地文件的读取,Chrome 86 版本后也提供了相应的API,但都存在使用限制和兼容性问题。有时开发者只是想利用浏览器编制一些简单的脚本完成一些任务,不想学习C、C++、Pyt

    2024年02月07日
    浏览(66)
  • 大学生数学建模赛题解析及优秀论文-2021电工杯A题高铁牵引供电系统运行数据分析及等值建模(附Python代码)

    我国是世界上电气化铁路运营里程最长、服役电力机车型号最多、运营最 繁忙的国家。截至 2020 年底,我国铁路年消耗电量约 800 亿千瓦时,约占三峡 年总发电量的 80% 。 图 1 为高速铁路牵引供电系统示意图,主要包括牵引变电所、牵引网和动车 组。牵引变电所将 220kV 三相

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包