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问题 我想用它自带的HTMLParser库 解析html页面某个标签的数据 求大神告知
如果你想提取指定tag之间的内容,建议使用bs4或者lxml去实现。
frombs4importBeautifulSoup
s="""<a>abcdefg</a><div>20</div>"""
soup=BeautifulSoup(s)
tag=soup.find("div")
printtag.string
如果解决了您的问回题请点赞!
如果未解答决请继续追问!
Ⅲ python怎么获取html中指定行内容
大体的思路:
遇到<div class='entry-content'> 设置标记flag = True
遇到</div>后 设置标记flag = False
当flag 为True时遇到<p> 设置标记getdata = True
遇到</p> 且getdata = True,设置getdata = False
python为我们提供了SGMLParser类,SGMLParser 将 HTML 分析成 8 类数据[1],然后对每一类调用单独的方法:使用时只需继承SGMLParser 类,并编写页面信息的处理函数。
python提供了SGMLParser类用于html文件的解析。用户只需从SGMLParser类继承子类,并在子类中对html文件做具体处理。
例如 具有如下结构的html文件
<div class='entry-content'>
<p>感兴趣内容1</p>
<p>感兴趣内容2</p>
……
<p>感兴趣内容n</p>
</div>
<div class='content'>
<p>内容1</p>
<p>内容2</p>
……
<p>内容n</p>
</div>
Ⅳ 怎么用python解析html
现在用起来比较方便的有两种:
1. pyquery (类似Jquery语法,对于js熟悉的人,用这个会比较上手)
2. beatifulsoup:这个功能比较强大,用起来也很方便,目前正在整理笔记中,其中一个亮点就是:可以使用正则来解析有规律的html标签内容。
还有一个主要的问题:爬取网页的时候,需要使用http代理。因为有的网站有了方爬取的策略,这部分也在整理中,后续会整理发布。
Ⅳ 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编写一个程序以尝试解析XML/HTML标签.
要给这段文字添加一个 root 标签,然后对里面的 node 进行遍历。root 标签的名字可以任意定(内但是必须添加一个)容,我这里使用的 root 命名,对于其它的名字也一样。如果你是直接读取的 XML 文件,而不是字符串,可以将文件打开,然后把文件句柄传入 ElementTree.parse() 函数,最后对其返回值进行遍历。
fromxml.etreeimportElementTree
parsed=ElementTree.XML('''<root>
<composer>WolfgangAmadeusMozart</composer><author>SamuelBeckett</author><city>London</city>
</root>''')
outstr=[]
fornodeinparsed:
outstr+=['%s:%s'%(node.tag,node.text)]
print(''.join(outstr))
Ⅶ 请问互联网的各位朋友,怎样用python将一个html文件内容修改成自己想要的内容后再导出新的html呢
;
Fobj=open(“my.html”);
Data=fobj.read();
Fobj.close();
Soup=BeautifulSoup(data);
Trlist=soup.findAll(“tr”);
Rownum=len(trlist);
Colnum=len(trlist[0]);
Trlist[0].insert(colnum,“<td>hahaha</td>”);
Tdlist=trlist[0].findAll(“td”);
Content=tdlist[0].renderContents();
Fobj=file(“my.html”,“w”);
Fobj.write(str(soup));
Fobj.close();
Ⅷ python解析html时解析不到不到网页源码中script下面的信息
import re
s= '<script>var j,l; </script>'
m = re.search("<script>(.*?)</script>", s)
print m.group(1)
>>>
var j,l;
>>>
Ⅸ python HTML处理
[<tdstyle="text-align:center">2014-12-31</td>,<tdstyle="text-align:center">6.16</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>1.76</td>]
[<tdstyle="text-align:center">2013-12-31</td>,<tdstyle="text-align:center">11.47</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>1.72</td>]
[<tdstyle="text-align:center">2012-12-31</td>,<tdstyle="text-align:center">-5.5</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>4.31</td>]
[<tdstyle="text-align:center">2011-12-31</td>,<tdstyle="text-align:center">14.83</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>0.53</td>]
[<tdstyle="text-align:center">2010-12-31</td>,<tdstyle="text-align:center">1.8</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>0.63</td>]
[<tdstyle="text-align:center">2009-12-31</td>,<tdstyle="text-align:center">21.69</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>5.61</td>]
[<tdstyle="text-align:center">2008-12-31</td>,<tdstyle="text-align:center">0.19</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>0.03</td>]
[<tdstyle="text-align:center">2007-12-31</td>,<tdstyle="text-align:center">2.89</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>0.77</td>]
[<tdstyle="text-align:center">2006-12-31</td>,<tdstyle="text-align:center">7.37</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>2.71</td>]
[<tdstyle="text-align:center">2005-12-31</td>,<tdstyle="text-align:center">3.99</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>28.66</td>]
[<tdstyle="text-align:center">2004-12-31</td>,<tdstyle="text-align:center">-132.62</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>78.84</td>]
[<tdstyle="text-align:center">2003-12-31</td>,<tdstyle="text-align:center">23.79</td>,<tdstyle="text-align:center">听</td>]
[<tdstyle="text-align:center">2002-12-31</td>,<tdstyle="text-align:center">-759.2139</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>745.9739</td>]
[<tdstyle="text-align:center">2001-12-31</td>,<tdstyle="text-align:center">-5.47</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>6.852</td>]
[<tdstyle="text-align:center">2000-12-31</td>,<tdstyle="text-align:center">6.82</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>3.95</td>]
[<tdstyle="text-align:center">1999-12-31</td>,<tdstyle="text-align:center">10.48</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>6.87</td>]
[<tdstyle="text-align:center">1998-12-31</td>,<tdstyle="text-align:center">12.28</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>7.21</td>]
[<tdstyle="text-align:center">1997-12-31</td>,<tdstyle="text-align:center">54</td>,<tdstyle="text-align:center"><fontstyle="color:green">隆媒</font>18</td>]
[<tdstyle="text-align:center">1996-12-31</td>,<tdstyle="text-align:center">72</td>,<tdstyle="text-align:center"><fontstyle="color:red">隆眉</font>7</td>]
[<tdstyle="text-align:center">1995-12-31</td>,<tdstyle="text-align:center">65</td>,<tdstyle="text-align:center">听</td>]
不止2004年的数据
我修改了下你的代码用的requests的库
importos
importsys
importtime
importrequests
importbs4
frompprintimportpprint
roe=open('ROE.txt','w')
req="http://vip.stock.finance.sina.com.cn/corp/view/vFD_FinancialGuideLineHistory.php?stockid=600159&typecode=financialratios59"
soup=bs4.BeautifulSoup(requests.get(req,timeout=30).text)
buffer=soup.find(id='Table1')
rows=buffer.find_all('tr')
forrowinrows:
cols=row.find_all('td')
text=str(cols)
if"-12-31"intext:
roe.write(text+' ')
time.sleep(2)
roe.close()
Ⅹ Python解析html出错
自然是文件编码的问题,文件读取utf-8格式,建议使用codecs模块,不用安装,直接import就行,使用fp = codecs.open(filename,'r','utf-8')读取utf-8编码文件,python自带的open是默认gbk的。此外,建议文件都使用utf-8格式,gbk实在是windows的遗留问题,utf-8本来可以一统天下,就是windows一直不改,才使得windows下文件编码一直很麻烦。