python调用html
‘壹’ 请问如何用python打开一个html文件
importwx.html2
classBrower(wx.Frame):
def__init__(self):
wx.Frame.__init__(self,None,-1,"BROWER",size=(-1,-1))
self.browser=wx.html2.WebView.New(self,style=0,size=(-1,-1))
self.html_file="test.html"
self.browser.LoadURL(os.path.realpath("test.html"))
‘贰’ html中调用python脚本
最常用的是用jquery的ajax功能是:
function serialGen(){
var Pattern = document.getElementById("pattern");
//用get方式将Pattern的值传到服务器上, 当然也可以使用post
$.get('ajax/test.html?patern=' + Pattern.value, function(data) {
document.forms[1].elements["pep"].value = data;
});
}
‘叁’ 在Python中使用HTML模版的教程
这篇文章主要介绍了在Python中使用HTML模版的教程,HTML模版也是Python的各大框架下的一个基本功能,需要的朋友可以参考下。Web框架把我们从WSGI中拯救出来了。现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了。
但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,但是,想想新浪首页的6000多行的HTML,你确信能在Python的字符串中正确地写出来么?反正我是做不到。
俗话说得好,不懂前端的Python工程师不是好的产品经理。有Web开发经验的同学都明白,Web App最复杂的部分就在HTML页面。HTML不仅要正确,还要通过CSS美化,再加上复杂的JavaScript脚本来实现各种交互和动画效果。总之,生成HTML页面的难度很大。
由于在Python代码里拼字符串是不现实的,所以,模板技术出现了。
使用模板,我们需要预先准备一个HTML文档,这个HTML文档不是普通芹腔的HTML,而是嵌入了一些变量和指令,然后,根据我们传入的数据,替换后嫌嫌衫,得到最终的HTML,发送给用户:
这就是传说中的MVC:Model-View-Controller,中文名“模型-视图-控制器”。
Python处理URL的函数就是C:Controller,Controller负责业务逻辑,比如检查用户名是否存在,取出用户信息等等;
包含变量{{ name }}的模板就是V:View,View负责显示逻者枝辑,通过简单地替换一些变量,View最终输出的就是用户看到的HTML。
MVC中的Model在哪?Model是用来传给View的,这样View在替换变量的时候,就可以从Model中取出相应的数据。
上面的例子中,Model就是一个dict:
{ name: Michael }
只是因为Python支持关键字参数,很多Web框架允许传入关键字参数,然后,在框架内部组装出一个dict作为Model。
现在,我们把上次直接输出字符串作为HTML的例子用高端大气上档次的MVC模式改写一下:
16
17
18
19
20
21
22
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route(/, methods=[GET, POST])
def home():
return render_template(home.html)
@app.route(/signin, methods=[GET])
def signin_form():
return render_template(form.html)
@app.route(/signin, methods=[POST])
def signin():
username = request.form[username]
password = request.form[password]
if username==admin and password==password:
return render_template(signin-ok.html, username=username)
return render_template(form.html, message=Bad username or password, username=username)
if __name__ == __main__:
app.run()
Flask通过render_template()函数来实现模板的渲染。和Web框架类似,Python的模板也有很多种。Flask默认支持的模板是jinja2,所以我们先直接安装jinja2:
?
1
$ easy_install jinja2
然后,开始编写jinja2模板:
?
1
home.html
用来显示首页的模板:
11
html
head
titleHome/title
/head
body
h1 style=font-style:italicHome/h1
/body
/html
form.html
用来显示登录表单的模板:
16
17
18
html
head
titlePlease Sign In/title
/head
body
{% if message %}
p style=color:red{{ message }}/p
{% endif %}
form action=/signin method=post
legendPlease sign in:/legend
pinput name=username placeholder=Username value={{ username }}/p
pinput name=password placeholder=Password type=password/p
pbutton type=submitSign In/button/p
/form
/body
/html
signin-ok.html
登录成功的模板:
?
7
8
html
head
titleWelcome, {{ username }}/title
/head
body
pWelcome, {{ username }}!/p
/body
/html
登录失败的模板呢?我们在form.html中加了一点条件判断,把form.html重用为登录失败的模板。
最后,一定要把模板放到正确的templates目录下,templates和app.py在同级目录下:
启动python app.py,看看使用模板的页面效果:
通过MVC,我们在Python代码中处理M:Model和C:Controller,而V:View是通过模板处理的,这样,我们就成功地把Python代码和HTML代码最大限度地分离了。
使用模板的另一大好处是,模板改起来很方便,而且,改完保存后,刷新浏览器就能看到最新的效果,这对于调试HTML、CSS和JavaScript的前端工程师来说实在是太重要了。
在Jinja2模板中,我们用{{ name }}表示一个需要替换的变量。很多时候,还需要循环、条件判断等指令语句,在Jinja2中,用{% ... %}表示指令。
比如循环输出页码:
?
1
2
3
{% for i in page_list %}
a href=/page/{{ i }}{{ i }}/a
{% endfor %}
如果page_list是一个list:[1, 2, 3, 4, 5],上面的模板将输出5个超链接。
除了Jinja2,常见的模板还有:
Mako:用和${xxx}的一个模板;
Cheetah:也是用和${xxx}的一个模板;
Django:Django是一站式框架,内置一个用{% ... %}和{{ xxx }}的模板。
小结
有了MVC,我们就分离了Python代码和HTML代码。HTML代码全部放到模板里,写起来更有效率。
‘肆’ Python实现简单HTML表格解析
本文实例讲述了Python实现简单HTML表格解析的方法。分享给大家供段余档大家参考。握乱具体分析如下:
这里依赖libxml2dom,确保首先安装!导入到你的脚毁谨步并调用parse_tables() 函数。
1. source = a string containing the source code you can pass in just the table or the entire page code
2. headers = a list of ints OR a list of strings
If the headers are ints this is for tables with no header, just list the 0 based index of the rows in which you want to extract data.
If the headers are strings this is for tables with header columns (with the tags) it will pull the information from the specified columns
3. The 0 based index of the table in the source code. If there are multiple tables and the table you want to parse is the third table in the code then pass in the number 2 here
It will return a list of lists. each inner list will contain the parsed information.
具体代码如下:
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118#The goal of table parser is to get specific information from specific
#columns in a table.
#Input: source code from a typical website
#Arguments: a list of headers the user wants to return
#Output: A list of lists of the data in each row
import libxml2dom
def parse_tables(source, headers, table_index):
parse_tables(string source, list headers, table_index)
headers may be a list of strings if the table has headers defined or
headers may be a list of ints if no headers defined this will get data
from the rows index.
This method returns a list of lists
#Determine if the headers list is strings or ints and make sure they
#are all the same type
j = 0
print Printing headers: ,headers
#route to the correct function
#if the header type is int
if type(headers[0]) == type(1):
#run no_header function
return no_header(source, headers, table_index)
#if the header type is string
elif type(headers[0]) == type(a):
#run the header_given function
return header_given(source, headers, table_index)
else:
#return none if the headers arent correct
return None
#This function takes in the source code of the whole page a string list of
#headers and the index number of the table on the page. It returns a list of
#lists with the scraped information
def header_given(source, headers, table_index):
#initiate a list to hole the return list
return_list = []
#initiate a list to hold the index numbers of the data in the rows
header_index = []
#get a document object out of the source code
doc = libxml2dom.parseString(source,html=1)
#get the tables from the document
tables = doc.getElementsByTagName(table)
try:
#try to get focue on the desired table
main_table = tables[table_index]
except:
#if the table doesnt exits then return an error
return [The table index was not found]
#get a list of headers in the table
table_headers = main_table.getElementsByTagName(th)
#need a sentry value for the header loop
loop_sentry = 0
#loop through each header looking for matches
for header in table_headers:
#if the header is in the desired headers list
if header.textContent in headers:
#add it to the header_index
header_index.append(loop_sentry)
#add one to the loop_sentry
loop_sentry+=1
#get the rows from the table
rows = main_table.getElementsByTagName(tr)
#sentry value detecting if the first row is being viewed
row_sentry = 0
#loop through the rows in the table, skipping the first row
for row in rows:
#if row_sentry is 0 this is our first row
if row_sentry == 0:
#make the row_sentry not 0
row_sentry = 1337
continue
#get all cells from the current row
cells = row.getElementsByTagName(td)
#initiate a list to append into the return_list
cell_list = []
#iterate through all of the header indexs
for i in header_index:
#append the cells text content to the cell_list
cell_list.append(cells[i].textContent)
#append the cell_list to the return_list
return_list.append(cell_list)
#return the return_list
return return_list
#This function takes in the source code of the whole page an int list of
#headers indicating the index number of the needed item and the index number
#of the table on the page. It returns a list of lists with the scraped info
def no_header(source, headers, table_index):
#initiate a list to hold the return list
return_list = []
#get a document object out of the source code
doc = libxml2dom.parseString(source, html=1)
#get the tables from document
tables = doc.getElementsByTagName(table)
try:
#Try to get focus on the desired table
main_table = tables[table_index]
except:
#if the table doesnt exits then return an error
return [The table index was not found]
#get all of the rows out of the main_table
rows = main_table.getElementsByTagName(tr)
#loop through each row
for row in rows:
#get all cells from the current row
cells = row.getElementsByTagName(td)
#initiate a list to append into the return_list
cell_list = []
#loop through the list of desired headers
for i in headers:
try:
#try to add text from the cell into the cell_list
cell_list.append(cells[i].textContent)
except:
#if there is an error usually an index error just continue
continue
#append the data scraped into the return_list
return_list.append(cell_list)
#return the return list
return return_list
希望本文所述对大家的Python程序设计有所帮助。
‘伍’ 如何用Python爬取出HTML指定标签内的文本
你好!
可以通过lxml来获取指定标签的内容。
#安装lxml
pipinstalllxml
importrequests
fromlxmlimporthtml
defgetHTMLText(url):
....
etree=html.etree
root=etree.HTML(getHTMLText(url))
#这里得到一个表格内tr的集合
trArr=root.xpath("//div[@class='news-text']/table/tbody/tr");
#循环显示tr里面的内容
fortrintrArr:
rank=tr.xpath("./td[1]/text()")[0]
name=tr.xpath("./td[2]/div/text()")[0]
prov=tr.xpath("./td[3]/text()")[0]
strLen=22-len(name.encode('GBK'))+len(name)
print('排名:{:<3},学校名称:{:<{}} ,省份:{}'.format(rank,name,strLen,prov))
希望对你有帮助!
‘陆’ 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调用BeautifuSoup进行html的文本内容提取问题 [
1.python代码是解释性代码,即不需要编译,直接就可以通过python解析器,去一点点解释翻译,直接运行的。所以,你说的“编译”就是不确切的说法。
2.UnicodeEncodeError的错误原因在于:
你在输出Unicode字符时,保存为默认的,ascii编码的字符串时,ascii字符集中没有包含对应的,十有八九是中文的字符,所以报错了。
先不说解决办法,因为从你的此处代码来看,从头到尾,都是不妥当的。
3.另外,你对返回的html代码,调用BeautifulSoup时,没有指定对应的字孙饥符编码类型。也是不妥当的做法。
4.总的来说,还仔码是那句,不论是本意是:
(1)获得对应的html代码,另存为对应的文件
还是
(2)想要实现下载某个url地址(对应的)文件
你的代码,都是逻辑上就很不明确的。
解决办法:
(1)获得对应的html代码,另存为对应的文件
想了下,还是懒得贴我的全部的代码了。
太麻烦了。
针对你自己的代码,你自己去把:
A。
op = open(filename,"wb")
改为
op = codecs.open(filename,"a+", "UTF-8")
B .
soup= BeautifulSoup(html)
改为:
soup= BeautifulSoup(html, from_encoding="xxx")
其中xxx是你所要打开的网则戚返页的编码类型,常见的有utf-8,gbk等。
是因url不同而不同的。
详情自己参考我写的:
【整理】关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释
(2)想要实现下载某个url地址(对应的)文件
参考我的,之前就实现好的函数:
crifanLib.py downloadFile
(这里不给贴地址,请自己用google搜标题,即可找到帖子地址)
‘捌’ python 怎么提取html内容啊(正则)
python提取html内容的方法。如下参考:
1.首先,打开Python来定义字符串,在定义的字符串后面加上中括号,然后在要提取的字符位置输入。
‘玖’ Python如何运行HTML程序
肯定是可以,写一个浏览器都没有问题。
不过正常情况不会去做,费神费力,通常嵌入浏览器插件就可以,比如qt。
‘拾’ 怎样用Python写一个Html的简单网页
1、打开sublime text 3,新建一个PY文件。