javascript 获取url获取页面第一张图片的方法是什么?我忘记了~~~就是在不知道id和name的情况下获取第一张图片的src

当前位置: >
Javascript访问html页面的控件的方法详细分析第1/2页
这段时间在公司比较的空闲,决定研究研究javascript访问html控件,这是很普遍的,这里我系统的研究javascript的访问方式,测试通过并有下面一些研究成就,供大家
下面切入正题: &&&访问控件的主要对象是:document对象。分别对应当前文档所有的(子对象)个人观点。并且已经提供的几个主要方法来访问对象。 1.&&&&&&&document.getElementById 2.&&&&&&&document.getElementsByName& 3&&&&&&&&&&&document.getElementsByTagName 4&&&&&&&&&&&document.all 下面我主要谈谈以上几个方法的具体用法: &&一.首先我来谈谈document.getElementById的用法。 Var&obj=document.getElementById(“ID”)&根据指定的ID属性值得到对象。返回id属性值等于ID的第一个对象的引用。假如对应的为一组对象,则返回该组对象中的第一个。 &input&name=”a”&type=”text”&id=”b”/& &input&name=”b”&type=”text”&id=”a”/&&& &input&type=”button”&name=”submint1”&value=”text1”&onclick=:”alert(document.getElementById(“b”)/&)”&input&type=”button”&name=”submint2”&value=”text2”&onclick=”alert(document.getElementById(“a”)/&)”我在IE中测试了上面代码,在第一个文本框中输入1,在第二个文本中输入2,然后点击两个按钮,大吃一斤。结果两个按钮都返回了第一个文本框的值。这说明了IE执行document.getElementById(elementName)的时候,返回的是第一个name或者id等于elementName的对象,并不是根据ID来查找的。 但相反我在firefox中就不存在这个问题。Firefox执行document.getElementById(elementName)的时候只能查找ID等于elementName对象,如果不存在在返回null. 二.下面看看document.getElementsByName的用法。 Var&obj=document.getElementsByName(“Name”)根据Name属性的值获取对象集合。返回name等于指定Name对象的集合。注意这里返回的是一个集合,包括只有一个元素的情况也是一个集合。 document.getElementsByName("name")[0?1?2?3?....]&这样来获取某一个元素。注意javascript中的集合取一个值可以用[],也可以用(),(本人测试通过,但没有资料这么写)。 如: &script& function&prop() {& var&objs=document.getElementsByName("a"); alert(objs(0).value);//或者可以alert(objs[0].value)也正确的。 } &/script& &input&type="text"&name="a"&id="b"&value="this&is&textbox"/& &input&type="button"&value="testing"&onclick="prop()"/& 三.Document.getElementsByTagName的用法: Var&ojbs=document.getElementsByTagName(“Tag”)根据基于指定元素名称对象的集合。返回Tag属性等于指定Tag标记的集合。这里也返回的是一个集合。(同上) 四.document.all用法。 document.all是页面内所有元素的一个集合。例如: document.all(0)表示页面的第一个元素。 Document.all(“txt”)表示页面上id或name等于txt的所有对象的单个元素和集合元素。 如果页面上的id或name等于txt只有一个元素(包括name和id情况),那么document.all()的结果就只是一个元素,反之就是获取一个集合。(综合了document.getElementById和document.getElementsByName的各自的特点)。 也可以这样写:document.all.txt也是一样。 例如: &input&&&name=aaa&&&value=aaa& &input&&&id=bbb&&&value=bbb& &&script&&&language=Jscript& &&&&&&alert(document.all.aaa.value)&&&&&//根据name取value& &&&&&&alert(document.all.bbb.value)&&&&&//根据id取value& &&/script& 代码2: &但是常常name可以相同(如:用checkbox取用户的多项爱好的情况) &&input&&&name=aaa&&&value=a1&& &&input&&&name=aaa&&&value=a2&&& &&input&&&id=bbb&&&value=bbb&&& &&script&&&language=Jscript&&& &&&&&alert(document.all.aaa(0).value)//显示a1 &&&&&alert(document.all.aaa(1).value)//显示a2& &&&&&alert(document.all.bbb(0).value)//这行代码会失败&&& &&/script&&& 理论上一个页面中的ID是互不相同的,如果出现不同的tags而有相同的id的话,document.all.id就会失败,就象这样:&input&&&id=aaa&&&value=a1&& &&input&&&id=aaa&&&value=a2& &&script&&&language=Jscript&& &&&&&&alert(document.all.aaa.value)//显示undefined而不是a1或者a2 &&/script& 所以说遇到了这种情况的话用下面这种写法: &&input&&&id=aaa&&&value=aaa1&& &&input&&&id=aaa&&&value=aaa2& &&input&&&name=bbb&&&value=bbb& &&input&&&name=bbb&&&value=bbb2& &&input&&&id=ccc&&&value=ccc& &&input&&&name=ddd&&&value=ddd&& &&script&&&language=Jscript& alert(document.all("aaa",0).value) alert(document.all("aaa",1).value) alert(document.all("bbb",0).value) alert(document.all("bbb",1).value) alert(document.all("ccc",0).value) alert(document.all("ddd",0).value)& &&/script& 另外document.all可以判断浏览器的种类是否是IE, document.all---------针对IE document.layers------------针对Netscape 这两个集合.all只在ie里面有效,layers只在nc里面有效 所以就可以通过这个方式来判断不同的浏览器。
当前1/2页&
友情提示:下次访问本站可以直接百度搜索:或直接输入
------分隔线----------------------------
lyngsat网站卫星数据解析:packagecom.wh.importjava.io.BufferedWimport...
这两天一直在弄ajax,用多了才发现了ajax 的cache问题,请求了好多次,得到了确是相同...
今天看了javascript 高级程序设计谈到了字符串连接的性能问题...
最近做的一个小功能,需要清空input type=file的值,但上传控件input type=file的值不...
取变量的Boolean值...
前支持javascript调试功能的工具越来越多,主要分为ie和firefox两大阵营。其他浏览器...运用web.py创建一个blog_运用webview加载本地html页面,并处理html页面中的javascript事件_运用wget抓取网站资源__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
运用web.py创建一个blog
运用webview加载本地html页面,并处理html页面中的javascript事件
运用wget抓取网站资源
运用web.py创建一个blog
使用web.py创建一个blog使用web.py创建一个blog 日  原文:/content/10/86_818 14574.shtml   注:本文针对web.py 0.23版,以及python 2.5.1;
  如果您使用web.py 0.1x版,或python 2.4.x,
  那么有些功能会有所不同   01、准备工作   先安装Python,然后安装web.py。
  不会安装的朋友,参考本博客的其他文章。
  数据库我准备使用Python自带的sqlite,因此不用另安装其他数据库。
  (我的运行环境是在Windows 2003下面,因为Python是跨平台的,所以理论上在Linux下面一样可行,但是我没有测试)
  当前程序版本:Python 2.5.1,web.py 0.23。
  (Python的官方网站:http://www.python.org)
  (web.py的官方网站:http://webpy.org)   02、数据库   数据库我是用sqlite,主要是我并不会做一个大大大大的blog,用mysql是不是太浪费了?
  而且sqlite现在python也集成了,用起来很方便。
  (当然也可以用mysql,很流行的,如果想使用mysql的话,请搜一下"MySQLdb")
  (在web.py 0.23版本中,目前只支持3种数据库:postgres、mysql、sqlite)   那么不用数据库可不可以?当然可以。我其实很喜欢用txt文件,呵呵。
  但是大家都用,我们最好也用。
  (很久很久之后的将来,你会发现用数据库的好处)   我创建一个Python源程序文件:database.py,然后写一些代码来创建一个数据库,并插入一些文件。   代码如下:   # -*- coding: cp936 -*-   import sqlite3 # 导入sqlite模块   con = sqlite3.connect("blog.db") # 连接到数据库文件   cur = con.cursor() # 创建一个指针   cur.execute("create table user1 (date, number, article)") # 创建1个表格,并创建3个域   tt1 = ('′, '1′, 'aaa') # 准备要插入的数据   cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt1) # 插入数据   tt2 = ('′, '2′, 'bbbbb') # 再插入一组数据   cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt2)   tt3 = ('′, '3′, 'cc') # 再再插入一组数据   cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt3)   mit() # 执行操作   cur.close() # 关闭指针   con.close() # 关闭数据库连接   如果你会SQL的话上面的东西就很好理解,不会的的话,也很好理解,是不是?
  数据库的连接--关闭,指针的创建--关闭,先建立一个表格,表格中有域,可以插入数据。
  (你用过Excel没有?差不多都是一样的)   有可能你不太理解为什么要把插入的数据写成('′, '1′, 'aaa')这样的。
  这样的数据结构是一个tuple(元祖),据说这样可以防止"数据库的注入式漏洞"。   好了,运行一下database.py吧,会在同目录下出现一个文件"blog.db"。这就是我们的数据库!   (最好能看一下Python Library Reference的13.13 sqlite3 - DB-API 2.0 interface for SQLite databases)
  (这里面会对python里面内置的sqlite3做一个简单但是非常有用的介绍)   03、第一个页面   我们现在来写第一个页面,看看web.py到底能不能跑起来。   代码如下:   import web   urls = (
  '/', 'index',
  class index:
  def GET(self):
  print 'index'   if __name__ == "__main__":
  web.run(urls, globals())   保存为:blog_1.py。并运行之。
  注意:一定要在命令提示符下运行!   可以在命令提示符下面看到:http://0.0.0.0:8080/,
  打开IE,访问:http://127.0.0.1:8080/,
  可以看到"index"了,是不是?   04、整体架构   现在让我们冷静一下,先想想我们要做的这个Blog的整体架构。
  虽然我们要做个最最最简单的Blog,但是还是要先想好然后再动手。   首先,要能"显示",能显示每个用户的文章、序号、以及日期。   然后,要能"登陆",只有"登陆"之后才能"写文章"。   我就想到这两点,我认为这就是一个blog的雏形了。   那么我们需要几个页面呢?   第1个:主页面,显示所有用户的文章。   第2个:登陆页面,用户在这里输入用户名和密码   第3个:显示页面,显示某个用户的文章   第4个:编辑页面,用户在这里写新文章   (当然,有一些功能也很重要,比如"修改",比如"图片"之类,慢慢来添加好不好?)   05、主页面   现在我们来做主页面,要能显示数据库中的数据。   我们直接来修改blog_1.py。   在import web这行代码的下面添加:   import sqlite3   把print 'index'这行代码删除,
  添加:   con = sqlite3.connect("blog.db")
  cur = con.cursor()
  cur.execute('select * from user1′)
  for row in cur:
  print row
  cur.close()
  con.close()   把这个文件另存为:blog_2.py。并运行之(记住要在命令提示符下运行)。
  然后我们打开IE,输入:http://127.0.0.1:8080/   我看到了:(u'′, u'1′, u'aaa') (u'′, u'2′, u'bbbbb') (u'′, u'3′, u'cc')
  你看到了没有?   06、主页面的第1次修改   其实blog_2.py是一个相当不成熟的例子,我想你也能感觉出来。
  因为数据库不是这样用的,web.py是一个框架(Framework),
  它提供了数据库和模板的方便调用方法,这也是我们使用框架的原因。   现在让我们来使用数据库吧。
  我们直接修改blog_1.py文件。   先在:web.run(urls, globals())这一行上面添加:
  web.config.db_parameters = dict(dbn='sqlite', db='blog.db')
  (这一行代码是配置数据库的,mysql的话还需要添加用户名和密码)
  其中dbn表示数据库的名称,我们填入sqlite;
  db表示具体数据库的文件名称,我们填入blog.db。
  (注意:一定要加后缀名)   然后把print 'index'这行代码删除,
  添加新的代码:   user1 = web.select("user1")
  print user1[0].date
  print len(list(user1))
  (第1行是遍历出整个user1表,第2行显示user1表的第1个元素的number值,第3行显示user1表的长度)
  (关于第3行看上去会有点奇怪,但是如果你试着用len(user1)这样就会出错,请试着理解,这就是"数据库的方式")   其中第1行可以改为user1 = web.query("select * from user1"),显示出来的东西会是完全一样的。
  为什么呢?
  因为本质上是一样的。但是web.query是用作查询之用的,最好还是专职专用。
  (详细的还是要看C:\Python25\Lib\site-packages\web文件夹下面的db.py)   把这个文件另存为:blog_3.py。并运行之。
  在127.0.0.1:8080下面我们应该能够看到:" 2"   其中""是user1[0].date的值;
  "2"是"数据库游标之后部分的长度"。
  游标是什么呢?即cursor(游标,指针),它指向数据库的当前位置。   接下来,你可以试试把user1[0].number改成user1[1].number或者user[2].article,看看会显示出来什么。   07、 主页面的第2次修改   我们试着来显示数据库中所有的元素。   直接修改blog_3.py,其实主要就是修改index类中的GET方法。代码如下:   class index:
  def GET(self):
  user1 = web.select("user1")
  user1_len = len(list(user1)) #数据库长度
  user1_date = web.select("user1") #得到日期
  user1_number = web.select("user1") #得到序号
  user1_article = web.select("user1") #得到文章内容
  for i in range(0, user1_len):
  print user1_date[i].date, \
  user1_number[i].number, \
  user1_article[i].article   另存为blog_4.py,并运行之,应该能看到: 1 aaa
3 cc   或者改为:   class index:
  def GET(self):
  user1 = web.select("user1")
  user1_len = len(list(user1)) #数据库长度
  user1_date = web.query("select date from user1") #得到日期
  user1_number = web.query("select number from user1") #得到序号
  user1_article = web.query("select article from user1") #得到文章内容
  for i in range(0, user1_len):
  print user1_date[i].date, \
  user1_number[i].number, \
  user1_article[i].article   另存,运行,得到的结果也和上面的一模一样。
  主要区别在于调用的方法不同,一个是web.select一个是web.query。
  (我看到别人写的一个程序,好像都是用的web.query)   虽然这样可以显示,不过好丑!
  怎么办?用模板!   08、 用模板   (模板的英文是templates)   我们一步一步来看看模板怎么用。   首先,先创建一个目录,名字就是templates。   然后,在这个目录里面创建一个文件,名字是index.html。   那么往这个index.html上面写些什么呢?   $def with (user1_date)   
  $user1_date[0].date
     在blog_4.py上面直接修改,在import web的下一行加上:   render = web.template.render('templates/')   然后另存为blog_5.py。
  这主要是告诉程序模板文件的位置。   然后修改index类的GET方法,原先的代码统统删掉,新代码如下:   user1_date = web.query("select date from user1") #得到日期
  print render.index(user1_date)   好了,现在保存,然后运行blog_5.py吧。
  我看到了:
  你呢?   09 蛋炒饭   我放弃web.py有一段时间了。主要是因为自己在做:
  /p/ssqpython/项目。
  但是因为空间的问题,SSQPython项目也搁置了,
  于是回头来看web.py。   web.py官方发布版本还没有更新,还是0.23(到为止)。
  据说在下一个版本0.3中,会更改render的显示方式,把print改为return。   现在准备重新把这个炒起来。
  (注:其实我注意到了在上面有类似的项目)   我们先来重新完整的考虑一下整个blog系统的架构:
  (注:如果你是从一开始来看本文章的,也许到了这里你会有一点失望,
  因为我会重新来做,不过前面就当作热身了,好不好?)
  - 登陆页面(login.html) -- (这个页面也同时作为注册页面,这样好吗?)
  - 浏览页面(blog.html) -- (这个页面也是主页面,即在不登陆的情况下显示此页面)
  - 发表页面(post.html)
  以上3个页面是用户(user)的页面。
  我在这里省去了很多东西,比如:回复文章功能、修改文章功能、删除文章功能等等。
  而且将来可以添加用户信息显示及自定义功能。   我们再来考虑一下管理员(admin)的页面:
  - 登陆页面(login.html) -- (管理员就不能有注册页面了,要在后台进行注册及密码修改等操作)
  - 查看页面(index.html) -- (浏览用户的数据,可删除用户、删除文章……)
  以上2个页面也不是很完整,还有许多功能需要添加,但是目前我还没有想到还有什么功能是必须的。   至于"登出"功能则会在每个页面都显示一个按钮的方式来实现。   这些架构的思考目前还不是很完善,我也是在一步一步摸索中……
  (注:其实"标签"或者"类别"的功能很重要,这个将来也要完善)   10 大排面(主浏览页面 生成数据库)   我们现在假设数据库中有很多很多数据,我们现在只是要把它们显示出来。
  这个显示页面是主浏览页面(index.html)。   首先我们来生成这样的数据。
  我们创建一个db.py文件。
  文件内容如下:   import sqlite3   con = sqlite3.connect('blog.db')
  cur = con.cursor()   cur.execute('create table article \
  (articleID, articleTitle, articleContent, \
  articleAuthor, articleTime)')   insert_datas = ('1′, 'title_1′, 'content_1′, 'user_1′, '′)
  cur.execute('insert into article \
  (articleID, articleTitle, articleContent, \
  articleAuthor, articleTime) values (?, ?, ?, ?, ?)', \
  insert_datas)   mit()
  cur.close()
  con.close()   运行:python db.py
  则会生成:blog.db文件   在这个数据库中有1个表(table),
  这个表有5个域(field)或者说是5个列(column),
  分别是:文章的ID号(这个会从1开始排列到无穷大)
  文章的标题
  文章的内容
  文章的作者
  文章的时间(这里当前记录的文章的发表时间,将来会有另一个来记录修改时间)   11 大肉面(主浏览页面 主程序文件)   我们再创建一个blog.py,这个会是我们这个blog的主程序文件。   import web   render = web.template.render('templates/')   urls = (
  '/', 'index',
  )   class index:
  def GET(self):
  datas = web.query("select * from article order by articleID desc")
  print render.index(datas)   if __name__ == "__main__":
  web.webapi.internalerror = web.debugerror
  web.config.db_parameters = dict(dbn='sqlite', db='blog.db')
  web.run(urls, globals(), web.reloader)   在这里我们定义了模板(template)的位置:templates文件夹。
  并且定义了当访问"/"的时候,调用index类。
  这表示我们访问127.0.0.1的时候,会显示index类中的print内容。   并且我们开启了debug,即:web.webapi.internalerror = web.debugerror
  并设置数据库为sqlite,访问文件为blog.db。   12 炸酱面(主浏览页面 模板)   我们先创建一个文件夹:templates。
  在这个文件夹下面创建一个index.html文件,这个文件就是我们用到的模板。
  文件内容如下:   $def with (datas)
  $for data in datas:
  $data.articleTitle
  $data.articleTime
  $data.articleContent
  Post by $data.articleAuthor
  Copyright ?? 2008 otherrrr. All rights reserved.
     其中:
  是定义HTML的文件格式
  文件头
  文件标题
  文档的其他信息
  之类的东西,CSS+DIV。
  目前我们还没有用上CSS,先定义一下,将来一定会用上的。   $def with (datas)定义了传递过来的变量,
  这个与blog.py中的print render.index(datas)
  相对应。
  $for data in datas:是想循环显示所有数据。
  datas是一个storage格式的数据,类似与dict(字典),
  所以调用其中的值时可以用[],例如data['articleTitle']
  但是用"."无疑更为方便!   13 卤肉饭(主浏览页面 好了)   好了,现在我们运行一下吧:python blog.py
  (这个要在命令行下运行)
  显示:http://0.0.0.0:8080/
  在浏览器中访问网址:http://127.0.0.1:8080/
  (请把这个网址添加到浏览器的收藏夹中,因为在后面会多次用到)
  (而且我建议用Firefox,因为有些插件感觉挺不错的,Firebug/YSlow)   可以看到:   title_1
user_1   content_1      因为现在只有一组数据,所以只显示了一组数据。   顺便说一下:如果你想修改端口,可以这样:python blog.py 80
  这样就可以浏览:http://127.0.0.1/了。   14 鸡腿饭(主浏览页面 多个文章同时显示)   现在我们开始修改了,你最好把刚才那些文件另存为一下,
  以免修改过程中出现"天灾人祸"。   我们首先修改db.py,新的代码如下:   import sqlite3   con = sqlite3.connect('blog.db')
  cur = con.cursor()   cur.execute('create table article \
  (articleID, articleTitle, articleContent, \
  articleAuthor, articleTime)')   insert_datas = ('1′, 'title_1′, 'content_1′, 'user_1′, '′)
  cur.execute('insert into article \
  (articleID, articleTitle, articleContent, \
  articleAuthor, articleTime) values (?, ?, ?, ?, ?)', \
  insert_datas)   insert_datas = ('2′, 'title_2′, 'content_2′, 'user_2′, '′)
  cur.execute('insert into article \
  (articleID, articleTitle, articleContent, \
  articleAuthor, articleTime) values (?, ?, ?, ?, ?)', \
  insert_datas)   mit()
  cur.close()
  con.close()   其实主要是又添加了一组数据。   删除目录下的blog.db,然后运行:python db.py   重新启动:python blog.py,在浏览器下可以看到:   title_2
user_2   content_2      title_1
user_1   content_1      是的,你很聪明的发现了,这是倒序的,也就是最后插入的数据在最上面显示。
  这时我故意的:注意blog.py中的代码:
  datas = web.query("select * from article order by articleID desc")
  注意到了desc了吗?
  desc表示倒序。   你可以试着删除desc来看看显示效果。   提示:当你修改blog.py的时候,并不用关闭web server,
  修改完成后也不用重启,可直接刷新页面浏览。
  这是因为我们在blog.py中的最后一行加了: web.reloader   15 茶蛋(网页链接CSS)   网页中插入CSS的方式有两种(我就知道两种,具体几种方式不确定)
  一种是连接文件:
  我们来修改一下index.html:
  在上面插入一行:      提示:当修改template文件夹中的文件之后,必须重启才能看到效果。   我们重启一下,看看浏览器中显示什么。
  什么也没发生变化!
  但是在命令行下,我们可以看到:
  … /static/style.css"
404 File not found   我们先创建一个文件夹:static,这个名字是web.py默认的放置静态文件的目录名。
  然后创建一个style.css,可以用记事本或者之类的东西创建。
  (我用gVim,对于vim我有这样的感受:它确实提高了我的效率,但是也让我的手--
  变得更累了)   文件内容如下:   *******
  (注:在百度的blog中填写css代码,会给显示出来,暂时无法给出CSS的代码)   然后刷新浏览器,感觉非常慢,
  但是最终还是显示出来了。
  字体、颜色、位置有了些变化,是不是?   详细的CSS介绍我就不说了,不过CSS对于网站的美观真的很重要。   16 咸鸭蛋(网页内置CSS)   我们也可以把CSS放到HTML中。   现在我们重新修改index.html,删掉上面加入如下文字:   
  *******
     (注:在百度的blog中填写css代码,会给显示出来,暂时无法给出CSS的代码)   其中的设置和style.css一模一样。   重启服务器,刷新浏览器。是不是快很多了?   据说用lighttpd或apache作为web server(服务器),
  对于像CSS文件这样的静态文件的读取会有很大的提高。
  这个我正在尝试中。   17 软炸里脊(用户发表文章代码)   用户发表文章,就是向数据库中添加信息。   首先修改blog.py   修改urls,代码如下:   urls = (
  '/', 'index',
  '/add', 'add',
  )   即定义网址后面是"/add"的会调用add类。   然后我们来写add类。   class add:
  def GET(self):
  print render.add()   def POST(self):
  i = web.input()
  t = time.localtime(time.time())
  st = time.strftime("%Y-%m-%d", t)
  datas = list(web.query("select * from article order by articleID desc"))
  n = web.insert('article',
  articleID=str(len(datas)+1), \
  articleTitle=i.post_title, \
  articleContent=i.post_content, \
  articleAuthor='user_3′, \
  articleTime=st)
  web.seeother('/')   GET中定义显示add.html这个模板。   POST中定义来提交后的处理。   i = web.input()
  得到网页中提交的数据。   time部分是处理日期的格式。
  注意:需要在blog.py最前面加上import time。   datas = list(…)
  这部分是算一下当前的ID会是多少。   为什么len(datas)+1要加str呢?
  因为不加str的话,排序会有问题。
  我个人认为sqlite太过于随便,不需要初始定义数据的类型,
  但是到后面才发现,其实预先定义还是有好处的。   这里面我们的用户暂时先默认为"user_3",将来会改的。   web.seeother('/')
  表示我们会跳转到"/"网址,也就是主页面。
  这部分将来也需要改,我初步的想法是跳到"/blog"页面。   简单说一下web.seeother()和web.redirect()的区别。
  redirect()无法后退,后退时会提示:是否需要重新提交数据。
  官方说明里面说:当彻底跳转的时候最好用redirect()。
  (注:感觉web.py的官方文档真的很少,而且有一部分是针对0.3版本的,
  但是主页能下载的却是0.23版本的)
  (注:web2py不知道大家用过没有,在邮件列表中感觉其作者"非常"热情,
  如果一个礼拜当中提问的人少,他都会说"太安静了",呵呵)   18 糖醋里脊(用户发表文章页面)   我们在templates目录下创建一个add.html。   我们需要:
  一个输入文章标题的文本框、
  一个输入文章内容的文本框、
  一个提交按钮。   (我们现在没有考虑用户登陆的情况,
  在实际情况下,如果用户未登陆,
  那么应该提示用户登陆,并引导
  用户到登陆页面)   代码如下(我隐去了CSS部分的代码):   
  Content
  Copyright ?? 2008 otherrrr. All rights reserved.
     其中定义了一个提交表单。
  表单中有两个文本域(textarea),一个用来输入标题,一个用来输入内容。
  并定义了一个提交按钮。   也许你会问是怎么回事?和有什么区别。
  都是换行的意思。
  但是从符合w3c的角度来说更规范。
  (就是说没有结束符的标签最好自己本身带一个结束符"/",
  同理还有input标签)   那么w3c是什么?一个网页规范组织。   19 清蒸里脊(发表文章测试)   在浏览器中访问:http://127.0.0.1:8080/add
  如果无法访问,请确认你的web服务器已经开启了。   输入一点东西吧,然后点击"Post it"按钮,
  看看效果。   再试一次,多输入点文字,看看有什么不同。   我发现一个问题,如果输入多行数据,但是显示的时候却是一行。
  只是数据之间加了空格。   如果要保证显示完全正确,是不是需要将"\n"改为""。   20 糖醋鱼(用户登陆代码)   修改blog.py,在urls中添加login,修改后代码如下:   urls = (
  '/', 'index',
  '/add', 'add',
  '/login', 'login',
  )   并创建一个login类,代码如下:   class login:
  def GET(self):
  print render.login()   def POST(self):
  i = web.input()
  web.setcookie('id', '1′)
  web.setcookie('username', i.post_username)
  web.seeother('/blog')   在GET()中我们定义了显示login模板。   在POST()中我们定义了接收到输入后,跳转到网址"/blog"。   注意看,这里我用到了cookie。
  cookie可以记录用户访问网站的一些信息。
  如果我们不关掉浏览器,那么这个cookie会一直在。
  (因此我们将来一定要做退出)   其中需要设置两个值,id和username。   在这里id我是未做完的状态,固定为"1"。
  正常情况下,应该判断用户的帐户在数据库中有没有,以及密码是否正确。
  如帐户和密码都正确就从数据库中返回出一个id号。   username则是输入的值。   (在登陆页面,其实最好用一些JavaScript来做判断。
  如:用户名或密码是否为空等等)   21 水煮鱼(用户登陆页面)   在撞见用户登陆页面之前,我们先从首页加个链接。
  修改index.html。   代码中添加对login页面的链接:   
  Log in
     并添加对应CSS设置部分。   然后在templates文件夹下创建login.html文件。
  文件中的内容如下:   
  Log in
  Username
  Password
  Copyright ?? 2008 otherrrr. All rights reserved.
     注:文件省去了CSS设置部分。   我们定义了一个表单(form),用来提交信息。
  然后有两个输入框(input),一个用来输入用户,一个用来输入密码。
  还有一个提交(submit)按钮,用来登陆。   密码框的类型(type)一定要指定为"password"。
  不然你输入密码旁边的眼神好的小子就能看见了。   22 家焖黄花鱼(跳转到blog页面)   首先我们还是要该blog.py   urls里面加上:'/blog', 'blog',
  (我觉得你现在应该知道这个怎么加了)   然后我们定义blog类:   class blog:
  def GET(self):
  session = web.cookies()
  datas = web.query("SELECT * FROM article where articleAuthor=$session.username", vars=locals())
  print render.blog(datas, session)   我们这里得到了cookies()。   并且我们从数据库中查找作者名为登陆用户名的所有文章。   接下来,是的,我们需要创建blog模板了。
  代码如下(没有CSS版本的):   $def with (datas, session)
  Logout
  $session.username
  $for data in datas:
  $data.articleTitle
  $data.articleTime
  $data.articleContent
  Post by $data.articleAuthor
  Copyright ?? 2008 otherrrr. All rights reserved.
     是的,这个和index.html非常相似。我就是从index.html上面改的。   主要不同的是这里:
  Logout
  $session.username
  我加了2个链接,一个是Logout(登陆出),一个是Add(添加文章)。   并添加显示了登陆进来的用户名。   注意最前面的部分:
  $def with (datas, session)
  是的,我们继承(获取?)了session变量。
  不然我们没办法显示用户名,对不对?   23 炸刀鱼(测试登陆一下下)   首先在index.html里面加一个链接:
  Log in
  主要是为了链接到login(登陆)页面。   我们先重启一下Web服务器:python blog.py   然后,在浏览器中访问http://127.0.0.1/
  这会让我们看到所有用户的文章。   然后我们点击Login链接,跳转到http://127.0.0.1/login
  这个就是登陆页面。   输入用户名:user_2
  输入密码:*****(随便输什么都行,因为我们并没有验证用户和密码的有效性)   然后点击Login按钮。   唰一下,跳转到http://127.0.0.1/blog。
  在这里,我们只看见了user_2发布的文章。   你可以重复试试登陆user_1或user_3。   (我也不知道自己为什么会用菜名作为小节名,大概是因为中午总吃不好的缘故吧)   24 火爆腰花(CSS的新处理方法)   把CSS放到网页中无疑是非常不爽的。
  我们来改一下下。   Blog.py中修改urls:   '/styles.css', 'style',   然后添加新的类(即处理方法):   class style:
  def GET(self):
  web.header("Content-Type","text/ charset=utf-8")
  print open('static/styles.css').read()   网页中写法如下:      然后只要将styles.css放在templates目录下就可以了。   25 黄瓜蜇皮(修改add类)   我们添加一项,当登陆之后会将用户名添加到数据库中。
  session = web.cookies()
  (好像反复的读取好像这个不太对,不过我现在还不会在web.py内部传递变量)   数据存储:sql加上xml,sql记录正文数据,xml记录不常变动的数据.
运用webview加载本地html页面,并处理html页面中的javascript事件
使用webview加载本地html页面,并处理html页面中的javascript事件
[img][/img][img][/img]WebViewDemo.javapackage com.test.
import java.util.ArrayL
import java.util.L
import android.app.A
import android.os.B
import android.os.H
import android.webkit.WebS
import android.webkit.WebV
import android.widget.T
import com.test.model.P
public class WebViewDemo extends Activity {
private WebView mWebV
private Handler mHandler = new Handler();
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.webviewdemo);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new Object() {
List&Person& persons = new ArrayList&Person&();
* 由html页面中调用该方法,获得persons的size(),并动态的生成该数量的button
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
// System.out.println("hello");
int nums = 10;
for (int i = 0; i & i++) {
Person person = new Person();
person.name = "name" + (i + 1);
person.age = (i + 1) + "";
persons.add(person);
String javascript = "javascript:wave(" + nums + ")";
mWebView.loadUrl(javascript);
* 由HTML页面调用,点击动态生成的button,
* @param num
public void show(int num) {
System.out.println(num);
Person p = persons.get(num);
.makeText(WebViewDemo.this,
"姓名: " + p.name + "
年龄: " + p.age,
Toast.LENGTH_SHORT).show();
}, "demo");
// 加载本地html页面
mWebView.loadUrl("file:///android_asset/demo.html");
package com.test.
public class Person {
运用wget抓取网站资源
使用wget抓取网站资源在linux上带有一个wget这个工具,可以抓取到静态网站所有的链接内容!
使用$wget --help 可以得到如下的参数:
GNU Wget 1.12,非交互式的网络文件下载工具。
用法: wget [选项]... [URL]...
长选项所必须的参数在使用短选项时也是必须的。
显示 Wget 的版本信息并退出。
打印此帮助。
--background
启动后转入后台。
--execute=COMMAND
运行一个‘.wgetrc’风格的命令。
登入并输入文件:
--output-file=FILE
将信息写入 FILE。
--append-output=FILE
将信息添加至 FILE。
打印大量调试信息。
安静模式(无信息输出)。
详尽的输出(此为默认值)。
-nv, --no-verbose
关闭详尽输出,但不进入安静模式。
--input-file=FILE
下载本地或外部 FILE 中的 URLs。
--force-html
把输入文件当成 HTML 文件。
--base=URL
解析与 URL 相关的
HTML 输入文件(由 -i -F 选项指定)。
--tries=NUMBER
设置重试次数为 NUMBER (0 代表无限制)。
--retry-connrefused
即使拒绝连接也是重试。
--output-document=FILE
将文档写入 FILE。
-nc, --no-clobber
不要重复下载已存在的文件。
--continue
继续下载部分下载的文件。
--progress=TYPE
选择进度条类型。
--timestamping
只获取比本地文件新的文件。
--server-response
打印服务器响应。
不下载任何文件。
--timeout=SECONDS
将所有超时设为 SECONDS 秒。
--dns-timeout=SECS
设置 DNS 查寻超时为 SECS 秒。
--connect-timeout=SECS
设置连接超时为 SECS 秒。
--read-timeout=SECS
设置读取超时为 SECS 秒。
--wait=SECONDS
等待间隔为 SECONDS 秒。
--waitretry=SECONDS
在取回文件的重试期间等待 1..SECONDS 秒。
--random-wait
取回时等待 0...2*WAIT 秒。
--no-proxy
关闭代理。
--quota=NUMBER
设置取回配额为 NUMBER 字节。
--bind-address=ADDRESS
绑定至本地主机上的 ADDRESS (主机名或是 IP)。
--limit-rate=RATE
限制下载速率为 RATE。
--no-dns-cache
关闭 DNS 查寻缓存。
--restrict-file-names=OS
限定文件名中的字符为 OS 允许的字符。
--ignore-case
匹配文件/目录时忽略大小写。
--inet4-only
仅连接至 IPv4 地址。
--inet6-only
仅连接至 IPv6 地址。
--prefer-family=FAMILY
首先连接至指定协议的地址
FAMILY 为 IPv6,IPv4 或是 none。
--user=USER
将 ftp 和 http 的用户名均设置为 USER。
--password=PASS
将 ftp 和 http 的密码均设置为 PASS。
--ask-password
提示输入密码。
关闭 IRI 支持。
--local-encoding=ENC
IRI 使用 ENC 作为本地编码。
--remote-encoding=ENC
使用 ENC 作为默认远程编码。
-nd, --no-directories
不创建目录。
--force-directories
强制创建目录。
-nH, --no-host-directories
不要创建主目录。
--protocol-directories
在目录中使用协议名称。
--directory-prefix=PREFIX
以 PREFIX/... 保存文件
--cut-dirs=NUMBER
忽略 NUMBER 个远程目录路径。
HTTP 选项:
--http-user=USER
设置 http 用户名为 USER。
--http-password=PASS
设置 http 密码为 PASS。
--no-cache
不在服务器上缓存数据。
--default-page=NAME
改变默认页
(默认页通常是“index.html”)。
--adjust-extension
以合适的扩展名保存 HTML/CSS 文档。
--ignore-length
忽略头部的‘Content-Length’区域。
--header=STRING
在头部插入 STRING。
--max-redirect
每页所允许的最大重定向。
--proxy-user=USER
使用 USER 作为代理用户名。
--proxy-password=PASS
使用 PASS 作为代理密码。
--referer=URL
在 HTTP 请求头包含‘Referer: URL’。
--save-headers
将 HTTP 头保存至文件。
--user-agent=AGENT
标识为 AGENT 而不是 Wget/VERSION。
--no-http-keep-alive
禁用 HTTP keep-alive(永久连接)。
--no-cookies
不使用 cookies。
--load-cookies=FILE
会话开始前从 FILE 中载入 cookies。
--save-cookies=FILE
会话结束后保存 cookies 至 FILE。
--keep-session-cookies
载入并保存会话(非永久) cookies。
--post-data=STRING
使用 POST 方式;把 STRING 作为数据发送。
--post-file=FILE
使用 POST 方式;发送 FILE 内容。
--content-disposition
当选中本地文件名时
允许 Content-Disposition 头部(尚在实验)。
--auth-no-challenge
send Basic HTTP authentication information
without first waiting for the server's
challenge.
HTTPS (SSL/TLS) 选项:
--secure-protocol=PR
选择安全协议,可以是 auto、SSLv2、
SSLv3 或是 TLSv1 中的一个。
--no-check-certificate
不要验证服务器的证书。
--certificate=FILE
客户端证书文件。
--certificate-type=TYPE
客户端证书类型, PEM 或 DER。
--private-key=FILE
私钥文件。
--private-key-type=TYPE
私钥文件类型, PEM 或 DER。
--ca-certificate=FILE
带有一组 CA 认证的文件。
--ca-directory=DIR
保存 CA 认证的哈希列表的目录。
--random-file=FILE
带有生成 SSL PRNG 的随机数据的文件。
--egd-file=FILE
用于命名带有随机数据的 EGD 套接字的文件。
--ftp-user=USER
设置 ftp 用户名为 USER。
--ftp-password=PASS
设置 ftp 密码为 PASS。
--no-remove-listing
不要删除‘.listing’文件。
不在 FTP 文件名中使用通配符展开。
--no-passive-ftp
禁用“passive”传输模式。
--retr-symlinks
递归目录时,获取链接的文件(而非目录)。
--recursive
指定递归下载。
--level=NUMBER
最大递归深度( inf 或 0 代表无限制,即全部下载)。
--delete-after
下载完成后删除本地文件。
--convert-links
让下载得到的 HTML 或 CSS 中的链接指向本地文件。
--backup-converted
在转换文件 X 前先将它备份为 X.orig。
-N -r -l inf --no-remove-listing 的缩写形式。
--page-requisites
下载所有用于显示 HTML 页面的图片之类的元素。
--strict-comments
开启 HTML 注释的精确处理(SGML)。
递归接受/拒绝:
--accept=LIST
逗号分隔的可接受的扩展名列表。
--reject=LIST
逗号分隔的要拒绝的扩展名列表。
--domains=LIST
逗号分隔的可接受的域列表。
--exclude-domains=LIST
逗号分隔的要拒绝的域列表。
--follow-ftp
跟踪 HTML 文档中的 FTP 链接。
--follow-tags=LIST
逗号分隔的跟踪的 HTML 标识列表。
--ignore-tags=LIST
逗号分隔的忽略的 HTML 标识列表。
--span-hosts
递归时转向外部主机。
--relative
只跟踪有关系的链接。
--include-directories=LIST
允许目录的列表。
--exclude-directories=LIST
排除目录的列表。
-np, --no-parent
不追溯至父目录。
可以从上面的帮助信息看到,其使用语法是:
用法: wget [选项]... [URL]...
以抓取http://zh.zkoss.org/doc/devguide/ 首页所有链接为例,有如下代码
bestupon@bestupon-laptop:~$ $wget -i http://zh.zkoss.org/doc/devguide/index.html http://zh.zkoss.org/doc/devguide/
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 javascript 获取url 的文章

 

随机推荐