python解析本地html
① lxml - 用python解析XML和HTML
lxml 是一个非常Pythonic的文档解析工具包,依赖于C语言库 libxml2 和 libslt 。它的独特之处在于高效率与功能的完整性兼备,且提供了简单易用Python原生API。最新版本的 lxml 支持CPython2.6至3.6的版本。
② 怎么用python解析html
现在用起来比较方便的有两种:
1. pyquery (类似Jquery语法,对于js熟悉的人,用这个会比较上手)
2. beatifulsoup:这个功能比较强大,用起来也很方便,目前正在整理笔记中,其中一个亮点就是:可以使用正则来解析有规律的html标签内容。
还有一个主要的问题:爬取网页的时候,需要使用http代理。因为有的网站有了方爬取的策略,这部分也在整理中,后续会整理发布。
③ Python网页解析库:用requests-html爬取网页
Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就不大习惯,很久之前就知道 Reitz 大神出了一个叫 Requests-HTML 的库,一直没有兴趣看,这回可算歹着机会用一下了。
使用 pip install requests-html 安装,上手和 Reitz 的其他库一样,轻松简单:
这个库是在 requests 库上实现的,r 得到的结果是 Response 对象下面的一个子类,多个一个 html 的属性。所以 requests 库的响应对象可以进行什么操作,这个 r 也都可以。如果需要解析网页,直接获取响应对象的 html 属性:
不得不膜拜 Reitz 大神太会组装技术了。实际上 HTMLSession 是继承自 requests.Session 这个核心类,然后将 requests.Session 类里的 requests 方法改写,返回自己的一个 HTMLResponse 对象,这个类又是继承自 requests.Response,只是多加了一个 _from_response 的方法来构造实例:
之后在 HTMLResponse 里定义属性方法 html,就可以通过 html 属性访问了,实现也就是组装 PyQuery 来干。核心的解析类也大多是使用 PyQuery 和 lxml 来做解析,简化了名称,挺讨巧的。
元素定位可以选择两种方式:
方法名非常简单,符合 Python 优雅的风格,这里不妨对这两种方式简单的说明:
定位到元素以后势必要获取元素里面的内容和属性相关数据,获取文本:
获取元素的属性:
还可以通过模式来匹配对应的内容:
这个功能看起来比较鸡肋,可以深入研究优化一下,说不定能在 github 上混个提交。
除了一些基础操作,这个库还提供了一些人性化的操作。比如一键获取网页的所有超链接,这对于整站爬虫应该是个福音,URL 管理比较方便:
内容页面通常都是分页的,一次抓取不了太多,这个库可以获取分页信息:
结果如下:
通过迭代器实现了智能发现分页,这个迭代器里面会用一个叫 _next 的方法,贴一段源码感受下:
通过查找 a 标签里面是否含有指定的文本来判断是不是有下一页,通常我们的下一页都会通过 下一页 或者 加载更多 来引导,他就是利用这个标志来进行判断。默认的以列表形式存在全局: ['next','more','older'] 。我个人认为这种方式非常不灵活,几乎没有扩展性。 感兴趣的可以往 github 上提交代码优化。
也许是考虑到了现在 js 的一些异步加载,这个库支持 js 运行时,官方说明如下:
使用非常简单,直接调用以下方法:
第一次使用的时候会下载 Chromium,不过国内你懂的,自己想办法去下吧,就不要等它自己下载了。render 函数可以使用 js 脚本来操作页面,滚动操作单独做了参数。这对于上拉加载等新式页面是非常友好的。
④ python 怎么提取html内容啊(正则)
python提取html内容的方法。如下参考:
1.首先,打开Python来定义字符串,在定义的字符串后面加上中括号,然后在要提取的字符位置输入。
⑤ python html 解析工具是什么意思
在准备我的 PyCon上关于HTML的演讲 的时候我觉得我应该对现有的一些解析器和文档模型做个性能对比。
实际上,情况有点复杂,因为处理HTML需要几个步骤:
解析这个 HTML
把它解析为一个对象(比如一个文档对象)
把它序列化
有些解析器只处理第一步,有些只处理第二步,有些能处理所有的三个步骤…。例如,ElementSoup 使用 ElementTree 来表示文档,却使用 BeautifulSoup 作为实际的解析器。而 BeautifulSoup 内部也拥有一个文档对象。 HTMLParser 仅仅做解析(不解析出任何对象),然而 html5lib 却能够生成几种不同的文档树(DOM树)。序列化也分为XML和HTML两种方式。
所以我选取了下面这些解析器的库做基准性能测试:
lxml:包含一个解析器,能够产生文档对象,支持HTML序列化。它也可以不适用内置的解析器而使用 BeautifulSoup 或者 html5lib 进行解析。
BeautifulSoup:nbsp;包含一个解析器,能够产生文档对象,支持HTML序列化。
html5lib:有解析器。它也有一个序列化器,但是我没有使用它。它也有一个内置的文档对象(即simpletree),只是…除了自我测试我也不知道这东西还能做什么。
ElementTree:这个包里有一个XML序列化器,ElementTree能够产生文档对象,它也是python内置的XML解析模块。(我觉得下个版本会带一个HTML序列化器,不过我也没测试这个XML序列化器)。它也有一个解析器,测试的时候我用html5lib当做解析器来测试ElementTree的。
cElementTree:这是一个使用C语言扩展实现的python模块,实现了ElementTree。
HTMLParser:包含一个解析器。但是其实它不能解析出文档对象,很多正常网页都不能正常处理(包含Table或者Script),有语法错误的网页就更处理不了了。它只是使用解析器遍历文档。
htmlfill:它使用了HTMLParser作为解析器,相对HTMLParser,它在解析过程中对Element做了更多处理。
Genshi[1]:包含一个解析器,能够产生文档对象,支持HTML序列化。
xml.dom.minidom:python标准库里的内置文档模型,html5lib 能够解析出这种文档对象。(我并不推荐使用minidom — 这篇文章里写了一些理由,还有很多理由我没写出来)
我预想 lxml 的性能会比较好,因为它基于 libxml2这个C库。但是实际上它的性能比我预计的还要好,超过其它所有的同类库。所以,除非考虑到一些难以解决的安装问题(尤其是在Mac上),我都推荐你用lxml 来进行HTML解析的工作。
我的测试代码在这里,你可以自己下载下来运行测试程序。里面包含了所有的样例数据,用来生成图表的命令在这里。这些测试数据来自于从 python.org 随机选取的一些页面(总共355个)。
解析
lxml:0.6; BeautifulSoup:10.6; html5lib ElementTree:30.2; html5lib minidom:35.2; Genshi:7.3; HTMLParser:2.9; htmlfill:4.5
第一个测试运行这些解析器解析文档。需要注意的是:lxml 比 HTMLParser快6倍,尽管 HTMLParser
不生成任何文档对象(lxml在内存中建立了一个文档树)。这里也没有包含 html5lib 所能生成的全部种类的树,因为每一种花费的时间都差不多。之所以包含了使用 xml.dom.minidom 作为输出结果的 html5lib 测试结果是为了说明 minidom 有多慢。Genshi确实很快,只是它也是最不稳定的,相比之下,html5lib , lxml 以及 BeautifulSoup 都要健壮的多。html5lib 的好处是,总是能够正确的解析HTML(至少在理论上如此)。
lxml在解析过程中会释放 GIL ,但是我觉得应该影响不大。
序列化
lxml:0.3; BeautifulSoup:2.0; html5lib ElementTree:1.9; html5lib minidom:3.8; Genshi:4.4
所有这些库执行序列化都很快,可是 lxml 又一次遥遥领先。ElementTree 和 minidom 只做XML序列化,但是没有理由说HTML序列化更快。还有就是,Genshi居然比minidom要慢,实话说任何比minidom要慢的东西都挺让人震惊的。
内存占用
lxml:26; BeautifulSoup:82; BeautifulSoup lxml:104; html5lib cElementTree:54; html5lib ElementTree:64; html5lib simpletree:98; html5lib minidom:192; Genshi:64; htmlfill:5.5; HTMLParser:4.4
最后一项测试是内存。我并不是特别确信我做这个测试的方法很科学,但是数据总能说明一些问题。这项测试会解析所有的文档并把解析出来的DOM树保存在内存中,利用 ps 命令结果的RSS(resident set size)段来表示进程占用的内存。计算基准内存占用之后所有的库已经被import,所以只有解析HTML和生成文档对象会导致内存使用量上升。
我才用 HTMLParser 作为基准线,因为它把文档保存在内存中,只产生一些中间字符串。这些中间字符串最终也不回占用多少内存,因为内存占用基本上等同于这些html问价大小之和。
测量过程中有个棘手的问题就是python的内存分配器并不会释放它请求的内存,所以,如果一个解析器创建了很多中间对象(字符串等等)然后又释放了它们,进程仍然会持有这些内存。为了检测是否有这种情况,我试着分配一些新的字符串知道进程占用的内存增长(检测已经分配但是没有被使用的内存),但是实际上没检测到什么,只有 BeautifulSoup 解析器,在序列化到一个 lxml 树的时候,显示出使用了额外的内存。
只有在内存测试中,html5lib 使用 cElementTree 来表示文档对象同使用 ElementTree 能表现出明显的不同。我倒不是很惊讶,我猜因为我没有找到一个C语言编写的序列化工具,我猜使用 cElementTree 构建文档树的话,只有在用本地代码调用它的时候比较快(就像本地的libxml,并且不需要把数据结构传递到python中)。
lxml比较节省内存很可能是因为它使用了本地的libxml2的数据结构,并且只有在需要的时候才创建Python对象。
总结
在进行基准测试之前我就知道lxml会比较快,但是我自己也没料到会这么快。
所以呢,总结一下:lxml太牛逼了[2]。你可以用很多种方式使用它,你可以对一个HTML进行解析,序列化,解析,再序列化,在机器卡机之前你能重复这些操作很多次。很多操作都是通过本地接口实现的,python只做了一层很浅的封装。例如,如果你做一次XPath查询,查询字符串会被编译为本地代码,然后遍历本地的libxml2对象,只在返回查询结果的时候才会产生一个python对象。 另外,测试中lxml内存占用比较小使我更有理由相信lxml在高负载的情况下仍然会很可靠。
我觉得,文档树相对按字符流解析(不生成树,只扫描一次文档并针对特定的标签做处理)更有优势。表面看起来按字符流解析更好:你不把整个文档放在内存里,处理的时间之和文档大小线性相关。HTMLParser就是这样一种解析器,遇到各种符号(标签开始和关闭,变迁中间的文字等等)。Genshi 也是用的这个模型,因为使用了一些更高级的特性(比如 filters
)所以使用起来更自然一些。其实字符流模型本身就不是一种特别自然的处理XML文档的方式,从某种程度上说,它只是用来处理一些本来就可以当做字符串处理的文档的一种笨拙的方法(regex可以实现同样的功能)。只有你需要处理上G的XML文件的时候按字符流解析才有意义(不过lxml和ElementTree针对这种情况都有额外的参数支持)。HTML文件不会有这么大,这些测试也有理由让我们相信lxml可以很好的处理大的HTML文件,所以一个大文档也不会导致一个为小文档优化过的系统崩溃。
Ian Bicking on Sunday, March30th, 2008
[1]. Genshi是EdgewallSoftware的产品,它的其他产品还包括大名鼎鼎的Trac。
[2]. 本文的作者Ian Bicking是lxml.html(lxml的一个模块)的开发者和维护者(这里修正一下)。
P.S. 译者记:这里还有一个解析器没有提到就是python标准库里的SGMLParser,它也可以产生ElementTree,但是性能很差,本机测试解析600k的html文档(ddd的单页html文档)需要480秒,不推荐应用在性能要求比较高的场合。本文作者也是lxml的作者,对自己的作品大力推荐也是正常的,我实测过lxml性能确实很好。
⑥ Python 数据处理(十八)—— HTML 表格
顶级 read_html() 函数可以接受 HTML 字符串、文件或URL,并将 HTML 表解析为 pandas DataFrames 列表。
注意 :即使 HTML 内容中仅包含一个表, read_html 也会返回 DataFrame 对象的列表
让我们看几个例子
读入 banklist.html 文件的内容,并将其作为字符串传递给 read_html
如果愿意,您甚至可以传入 StringIO 的实例
读取 URL 并匹配包含特定文本的表
指定一个标题行(默认情况下 <th> 或 <td> 位于 <thead> 中的元素用于形成列索引,如果 <thead> 中包含多个行,那么创建一个多索引)
指定索引列
指定要跳过的行数:
使用列表指定要跳过的行数( range 函数也适用)
指定一个 HTML 属性
指定应转换为 NaN 的值
指定是否保持默认的 NaN 值集
可以为列指定转换器。这对于具有前导零的数字文本数据很有用。
默认情况下,将数字列转换为数字类型,并且前导零会丢失。为了避免这种情况,我们可以将这些列转换为字符串
组合上面的选项
读取 to_html 的输出(会损失浮点数的精度)
当只提供了一个解析器时,如果解析失败, lxml 解析器会抛出异常,最好的方式是指定一个解析器列表
但是,如果安装了 bs4 和 html5lib 并传入 None 或 ['lxml','bs4'] ,则解析很可能会成功。
DataFrame 对象有一个实例方法 to_html ,它将 DataFrame 的内容呈现为 html 表格。
函数参数与上面描述的方法 to_string 相同。
columns 参数将限制显示的列
float_format 参数控制浮点值的精度
bold_rows 默认情况下将使行标签加粗,但你可以关闭它
classes 参数提供了给 HTML 表 设置 CSS 类的能力。
请注意,这些类附加到现有的 dataframe 类之后
render_links 参数提供了向包含 url 的单元格添加超链接的能力
最后, escape 参数允许您控制 HTML 结果中是否转义了 "<" 、 ">" 和 "&" 字符(默认情况下为 True )。
因此,要获得没有转义字符的 HTML ,请传递 escape=False
转义
不转义
在某些浏览器上这两个 HTML 表可能并不会显示出差异。
在顶级 pandas io 函数 read_html 中,用于解析 HTML 表的库存在一些问题
⑦ python 解析html 什么包好
对html的解析是网页抓取的基础,分析抓取的结果找到自己想要的内容或标签以达到抓取的目的。
HTMLParser是python用来解析html的模块。它可以分析出html里面的标签、数据等等,是一种处理html的简便途径。 HTMLParser采用的是一种事件驱动的模式,当HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来通知程序处理。它主要的用户回调函数的命名都是以handler_开头的,都是HTMLParser的成员函数。当我们使用时,就从HTMLParser派生出新的类,然后重新定义这几个以handler_开头的函数即可。这几个函数包括:
handle_startendtag 处理开始标签和结束标签
handle_starttag 处理开始标签,比如<xx> tag不区分大小写
handle_endtag 处理结束标签,比如</xx>
handle_charref 处理特殊字符串,就是以开头的,一般是内码表示的字符
handle_entityref 处理一些特殊字符,以&开头的,比如
handle_data 处理数据,就是<xx>data</xx>中间的那些数据
handle_comment 处理注释
handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
handle_pi 处理形如<?instruction>的东西
def handle_starttag(self,tag,attr):
#注意:tag不区分大小写,此时也可以解析 <A 标签
# SGMLParser 会在创建attrs 时将属性名转化为小写。
if tag=='a':
for href,link in attr:
if href.lower()=="href":
pass
1. 基本解析,找到开始和结束标签
[python] view plain
<span style="font-size:18px;">#coding:utf-8
from HTMLParser import HTMLParser
'''''
HTMLParser的成员函数:
handle_startendtag 处理开始标签和结束标签
handle_starttag 处理开始标签,比如<xx>
handle_endtag 处理结束标签,比如</xx>
handle_charref 处理特殊字符串,就是以开头的,一般是内码表示的字符
handle_entityref 处理一些特殊字符,以&开头的,比如
handle_data 处理数据,就是<xx>data</xx>中间的那些数据
handle_comment 处理注释
handle_decl 处理<!开头的,比如<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
handle_pi 处理形如<?instruction>的东西
'''
class myHtmlParser(HTMLParser):
#处理<!开头的内容
def handle_decl(self,decl):
print 'Encounter some declaration:'+ decl
def handle_starttag(self,tag,attrs):
print 'Encounter the beginning of a %s tag' % tag
def handle_endtag(self,tag):
print 'Encounter the end of a %s tag' % tag
#处理注释
def handle_comment(self,comment):
print 'Encounter some comments:' + comment
if __name__=='__main__':
a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\
<html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">链接到163</a></body></html>'
m=myHtmlParser()
m.feed(a)
m.close()
输出结果:
Encounter some declaration:DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
Encounter the beginning of a html tag
Encounter the beginning of a head tag
Encounter some comments:insert javaScript here!
Encounter the beginning of a title tag
Encounter the end of a title tag
Encounter the beginning of a body tag
Encounter the beginning of a a tag
Encounter the end of a a tag
Encounter the end of a body tag
Encounter the end of a html tag</span>
⑧ python HTML解析之 - lxml
lxml是处理XML和HTML的python语言,解析的时候,自动处理各种编码问题。而且它天生支持 XPath 1.0、XSLT 1.0、定制元素类。
安装:
HTML 实例
test, test.html指上述实例
获取 a 的所有标签, 这种html内容有多种写法,可以 直接得到了4个元素。
按照(2)中的方法,再加上 /@href ,可以直接得到属性值。
或者得到(2)中的结果,一一轮询。
更多表达式见 python xpath的学习
参考: https://www.jianshu.com/p/2ae6d51522c3
⑨ Python html 模块简介
比如:
比如,数学符号 , ,可以直接获得:
escape 将特殊字符 & , < 和 > 替换为HTML安全序列。如果可选的 flags quote 为 True (默认值),则还会翻译引号字符,包括双引号( " )和单引号( ' )字符。
将字符串 s 中的所有命名和数字字符引用 (例如 > , > , > ) 转换为相应的 Unicode 字符。此函数使用 HTML 5 标准为有效和无效字符引用定义的规则,以及 HTML 5 命名字符引用列表 。
这个模块定义了一个 HTMLParser 类,为 HTML(超文本标记语言)和 XHTML 文本文件解析提供基础。
class html.parser.HTMLParser(*, convert_charrefs=True) 创建一个能解析无效标记的解析器实例。查找标签(tags)和其他标记(markup)并调用 handler 函数。
用法:
通过调用 self.handle_starttag 处理开始标签,或通过调用 self.handle_startendtag 处理结束标签。标签之间的数据通过以 data 为参数调用 self.handle_data 从解析器传递到派生类(数据可以分成任意块)。如果 convert_charrefs 为 True ,则将字符引用自动转换为相应的 Unicode 字符(并且 self.handle_data 不再拆分成块),否则通过调用带有字符串的 self.handle_entityref 或 self.handle_charref 来传递它们以分别包含命名或数字引用作为参数。如果 convert_charrefs 为 True (默认值),则所有字符引用( script / style 元素中的除外)都会自动转换为相应的 Unicode 字符。
一个 HTMLParser 类的实例用来接受 HTML 数据,并在标记开始、标记结束、文本、注释和其他元素标记出现的时候调用对应的方法。要实现具体的行为,请使用 HTMLParser 的子类并重载其方法。
这个解析器不检查结束标记是否与开始标记匹配,也不会因外层元素完毕而隐式关闭了的元素引发结束标记处理。
下面是简单的 HTML 解析器的一个基本示例,使用 HTMLParser 类,当遇到开始标记、结束标记以及数据的时候将内容打印出来。
输出:
HTMLParser.reset() 重置实例。丢失所有未处理的数据。在实例化阶段被隐式调用。
HTMLParser.feed(data) 填充一些文本到解析器中。如果包含完整的元素,则被处理;如果数据不完整,将被缓冲直到更多的数据被填充,或者 close() 被调用。 data 必须为 str 类型。
HTMLParser.close() 如同后面跟着一个文件结束标记一样,强制处理所有缓冲数据。这个方法能被派生类重新定义,用于在输入的末尾定义附加处理,但是重定义的版本应当始终调用基类 HTMLParser 的 close() 方法。
HTMLParser.getpos() 返回当前行号和偏移值。
HTMLParser.get_starttag_text() 返回最近打开的开始标记中的文本。结构化处理时通常应该不需要这个,但在处理“已部署”的 HTML 或是在以最小改变来重新生成输入时可能会有用处(例如可以保留属性间的空格等)。
下列方法将在遇到数据或者标记元素的时候被调用。他们需要在子类中重载。基类的实现中没有任何实际操作(除了 handle_startendtag() ):
HTMLParser.handle_starttag 这个方法在标签开始的时候被调用(例如: <div id="main"> )。 tag 参数是小写的标签名。 attrs 参数是一个 (name, value) 形式的列表,包含了所有在标记的 <> 括号中找到的属性。 name 转换为小写, value 的引号被去除,字符和实体引用都会被替换。比如,对于标签 <a href="https://www.cwi.nl/"> ,这个方法将以下列形式被调用 handle_starttag('a', [('href', 'https://www.cwi.nl/')]) 。 html.entities 中的所有实体引用,会被替换为属性值。
HTMLParser.handle_endtag(tag) 此方法被用来处理元素的结束标记(例如: </div> )。 tag 参数是小写的标签名。
HTMLParser.handle_startendtag(tag, attrs) 类似于 handle_starttag() , 只是在解析器遇到 XHTML 样式的空标记时被调用( <tag ... /> )。这个方法能被需要这种特殊词法信息的子类重载;默认实现仅简单调用 handle_starttag() 和 handle_endtag() 。
HTMLParser.handle_data(data) 这个方法被用来处理任意数据(例如:文本节点和 <script>...</script> 以及 <style>...</style> 中的内容)。
HTMLParser.handle_entityref(name) 这个方法被用于处理 &name; 形式的命名字符引用(例如 > ),其中 name 是通用的实体引用(例如: 'gt' )。如果 convert_charrefs 为 True,该方法永远不会被调用。
HTMLParser.handle_charref(name) 这个方法被用来处理 NNN; 和 NNN; 形式的十进制和十六进制字符引用。例如, > 等效的十进制形式为 > ,而十六进制形式为 > ;在这种情况下,方法将收到 '62' 或 'x3E' 。如果 convert_charrefs 为 True ,则该方法永远不会被调用。
HTMLParser.handle_comment(data) 这个方法在遇到注释的时候被调用(例如: )。例如, 这个注释会用 ' comment ' 作为参数调用此方法。
Internet Explorer 条件注释(condcoms)的内容也被发送到这个方法,因此,对于 ``,这个方法将接收到 '[if IE 9]>IE9-specific content<![endif]' 。
HTMLParser.handle_decl(decl) 这个方法用来处理 HTML doctype 申明(例如 <!DOCTYPE html> )。 decl 形参为 <!...> 标记中的所有内容(例如: 'DOCTYPE html' )。
HTMLParser.handle_pi(data) 此方法在遇到处理指令的时候被调用。 data 形参将包含整个处理指令。例如,对于处理指令 <?proc color='red'> ,这个方法将以 handle_pi("proc color='red'") 形式被调用。它旨在被派生类重载;基类实现中无任何实际操作。
注解: HTMLParser 类使用 SGML 语法规则处理指令。使用 '?' 结尾的 XHTML 处理指令将导致 '?' 包含在 data 中。
HTMLParser.unknown_decl(data) 当解析器读到无法识别的声明时,此方法被调用。 data 形参为 <![...]> 标记中的所有内容。某些时候对派生类的重载很有用。基类实现中无任何实际操作。
因此,我们可以如此定义:
下面介绍如何解析 HTML 文档。
解析一个文档类型声明:
解析一个具有一些属性和标题的元素:
script 和 style 元素中的内容原样返回,无需进一步解析:
解析注释:
解析命名或数字形式的字符引用,并把他们转换到正确的字符(注意:这 3 种转义都是 '>' ):
填充不完整的块给 feed() 执行, handle_data() 可能会多次调用(除非 convert_charrefs 被设置为 True ):
解析无效的 HTML (例如:未引用的属性)也能正常运行:
⑩ python可以爬取本地html页面信息吗
可以的,主要是把URL换成本地HTML页面的目录就好了。