首页 > 编程语言 > 详细

Python归纳 | 爬虫基础知识

时间:2019-04-29 15:40:19      阅读:414      评论:0      收藏:0      [点我收藏+]

1. urllib模块库

Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包:

urllib.error    由urllib.request引发的异常类
urllib.parse    URL解析组件
urllib.request    用于打开网址的可扩展库。
urllib.response    urllib使用的响应类。
urllib.robotparser    加载robots.txt文件并回答有关其他网址可抓取性的问题。

使用urllib库进行post操作,如何建立post数据格式?
1 将数据以字典形式建立
2 利用urllib.parse包的urlencode方法:

urlretrieve()函数

urlretrieve()将远程链接数据下载到本地
urlretrieve(url, filename=None, reporthook=None, data=None)
链接、保存本地路径、回调函数、post导服务器的数据

2. Beautiful Soup模块库

?Beautiful Soup是一个可以从HTML或XML文件中提取数据的第三方Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库执行速度适中文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快文档容错能力强 需要安装C语言库
html5lib BeautifulSoup(markup, "html5lib") 最好的容错性以浏览器的方式解析文档生成HTML5格式的文档 速度慢不依赖外部扩展

2.1 创建Beautiful Soup对象

from bs4 import BeautifulSoup
#html为解析的页面获得html信息,为方便讲解,在此定义一个html文件
html = """
<html>
<head>
<title>CRIME</title>
</head>
<body>
<p class="title" name="blog"><b>My Blog</b></p>
<li><!--注释--></li>
<a href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a><br/>
<a href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link2">Html举例1</a><br/>
<a href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link3">Html举例1</a><br/>
</body>
</html>

?创建Beautiful Soup对象

soup = BeautifulSoup(html,'lxml')

?还可以使用本地HTML文件来创建对象

soup = BeautifulSoup(open(test.html),'lxml')

?使用如下代码格式化输出

print(soup.prettify())

2.2 Beautiful Soup四大对象

?Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment
(1) Tag

?Tag通俗点讲就是HTML中的一个个标签,例如

<title>CRIME</title>    # title就是HTML标签,标签加入里面包括的内容就是Tag

?用 Beautiful Soup 获取 Tags

print(soup.title)
#<title>CRIMEi</title>

print(soup.head)
#<head> <title>CRIME</title></head>

print(soup.a)
#<a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a>

print(soup.p)
#<p class="title" name="blog"><b>My Blog</b></p>

?验证一下这些对象的类型:

print(type(soup.title))
#<class 'bs4.element.Tag'>

?Tag有两个重要的属性:name和attrs

name:
print(soup.name)
print(soup.title.name)
#[document]
#title

?soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。

attrs:
print(soup.a.attrs)
#{'class': ['sister'], 'href': 'http://xxxxx/xxxx/xxxx/xxxx/xxxx', 'id': 'link1'}

?把a 标签的所有属性打印输出,得到的类型是一个字典。
?如果想要单独获取某个属性,例如我们获取a标签的class叫什么,两个等价的方法如下:

print(soup.a['class'])
print(soup.a.get('class'))
#['sister']
#['sister']

?得到了标签的内容,想要获取标签内部的文字,用 .string即可

print(soup.title.string)
#CRIME
(3) BeautifulSoup

?BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性:

print(type(soup.name))
print(soup.name)
print(soup.attrs)
#<class 'str'>
#[document]
#{}
(4) Comment

?Comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。

print(soup.li)
print(soup.li.string)
print(type(soup.li.string))
#<li><!--注释--></li>
#注释
#<class 'bs4.element.Comment'>

?li标签里的内容实际上是注释,但是如果我们利用 .string 来输出它的内容,我们发现它已经把注释符号去掉了,所以这可能会给我们带来不必要的麻烦。
?我们打印输出下它的类型,发现它是一个 Comment 类型,所以,我们在使用前最好做一下判断,判断代码如下:

from bs4 import element

if type(soup.li.string) == element.Comment:
     print(soup.li.string)

?上面的代码中,我们首先判断了它的类型,是否为 Comment 类型,然后再进行其他操作,如打印输出。

2.3 遍历文档数

(1) 直接子节点(不包含孙节点)
contents:

?tag的content属性可以将tag的子节点以列表的方式输出:

print(soup.body.contents)
#['\n', <p class="title" name="blog"><b>My Blog</b></p>, '\n', <li><!--注释--></li>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link2">Html举例2</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link3">Html举例3</a>, <br/>, '\n']

?输出方式为列表,我们可以用列表索引来获取它的某一个元素:

print(soup.body.contents[1])
<p class="title" name="blog"><b>My Blog</b></p>
children:

?它返回的不是一个 list,不过我们可以通过遍历获取所有子节点,它是一个 list 生成器对象:

for child in soup.body.children:
     print(child)
(2) 搜索文档树(find()、find_all()函数)

?find_all方法返回文档中所有匹配对象的列表

find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)

?find方法返回第一个可匹配的对象,即find_all(...limit=1...)

find(name=None, attrs={}, recursive=True, text=None , **kwargs ) 

?find与find_all除了返回类型不一样,参数用法都一样,以下以find_all为例

name参数:

?name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉。

传递字符:

?最简单的过滤器是字符串,在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容,下面的例子用于查找文档中所有的<a>标签:

print(soup.find_all('a'))
#['\n', <p class="title" name="blog"><b>My Blog</b></p>, '\n', <li><!--注释--></li>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" class="sister" id="link1">Html举例1</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link2">Html举例2</a>, <br/>, '\n', <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link3">Html举例3</a>, <br/>, '\n']
传递正则表达式:

? 如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和<b>标签都应该被找到

import re
for tag in soup.find_all(re.compile("^b")):
     print(tag.name)
#body
#b
#br
#br
#br
传递列表:

? 如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回,下面代码找到文档中所有标签和<b>标签:</p> <pre><code>print(soup.find_all(['title','b'])) #[<title>Jack_Cui</title>, <b>My Blog</b>]</code></pre> <h6 id="传递true"><strong>传递True:</strong></h6> <p>? True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点:</p> <pre><code>for tag in soup.find_all(True): print(tag.name) #html #head ... #br</code></pre> <h5 id="attrs参数"><strong>attrs参数:</strong></h5> <p>? 我们可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag。</p> <pre><code>print(soup.find_all(attrs={"class":"title"})) #[<p class="title" name="blog"><b>My Blog</b></p>]</code></pre> <h5 id="recursive参数"><strong>recursive参数:</strong></h5> <p>? 调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。</p> <h5 id="text参数"><strong>text参数:</strong></h5> <p>? 通过 text 参数可以搜搜文档中的字符串内容,与 name 参数的可选值一样, text 参数接受字符串 , 正则表达式 , 列表, True。</p> <pre><code> print(soup.find_all(text="Python3网络爬虫(三):urllib.error异常")) #['Python3网络爬虫(三):urllib.error异常']</code></pre> <h5 id="limit参数"><strong>limit参数:</strong></h5> <p>?find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果。<br /> ?文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:</p> <pre><code> print(soup.find_all("a", limit=2)) #[<a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link1">Html事例1</a>, <a class="sister" href="http://xxxxx/xxxx/xxxx/xxxx/xxxx" id="link2">Html事例2</a>]</code></pre> <h5 id="attrs参数-1"><strong>attrs参数:</strong></h5> <p>?如果传入 class 参数,Beautiful Soup 会搜索每个 class 属性为 title 的 tag 。kwargs 接收字符串,正则表达式</p> <pre><code>print(soup.find_all(class_="title")) #[<p class="title" name="blog"><b>My Blog</b></p>]</code></pre> <h3 id="python爬虫入门实战"><strong>Python爬虫入门实战</strong></h3> <h5 id="爬虫流程"><strong>爬虫流程</strong></h5> <ul> <li>先由urllib的request打开Url得到网页html文档</li> <li>浏览器打开网页源代码分析元素节点</li> <li>通过Beautiful Soup或则正则表达式提取想要的数据</li> <li>存储数据到本地磁盘或数据库(抓取,分析,存储)</li> </ul> <p>练习一:对豆瓣的一个电影排名URL进行抓取</p> <pre><code>from urllib import request #导入urillib中的request模块 from bs4 import BeautifulSoup #导入bs4中的BeautifulSoup模块 ##构造头文件,模拟浏览器访问 url="https://movie.douban.com/chart" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} page = request.Request(url,headers=headers) #用urllib的request打开Url得到网页html文档 page_info = request.urlopen(page).read().decode('utf-8') #打开Url,获取HttpResponse返回对象并读取其ResposneBody soup = BeautifulSoup(page_info, 'html.parser') # 将获取到的内容转换成BeautifulSoup格式,并将html.parser作为解析器 titles = soup.find('div','indent') # 查找所有div标签中class='indent'的Tag for t in titles.find_all('a',class_="nbg"): # 查找所有a标签中class=nbg的Tag(隐藏的class属性不解!!!!) print(t.attrs['title']) # 打印查找到的每一个a标签中的title print(t.attrs['href']) #打印查找到的每一个a标签中的文章链接href #在磁盘以只写的方式打开/创建一个名为 articles 的txt文件 #open()是读写文件的函数,with语句会自动close()已打开文件 with open(r"D:\BaiduYunDownload\articles.txt","w") as file: for t in titles.find_all('a',class_="nbg"): file.write(t.attrs['title']+'\n') file.write(t.get('href')+'\n\n') </code></pre> <p>练习二:爬取169图片并保存到本地</p> <pre><code>from urllib import request #导入urillib中的request模块 from bs4 import BeautifulSoup #导入bs4中的BeautifulSoup模块 import re import time def getImg(url): ##构造头文件,模拟浏览器访问 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} page = request.Request(url,headers=headers) #用request打开Url,获取HttpResponse返回对象并读取其ResposneBody html=request.urlopen(page).read().decode('utf-8','ignore') #将获取到的内容转换成BeautifulSoup格式,并将html.parser作为解析器 soup = BeautifulSoup(html, 'html.parser') links=soup.find('div',class_='big_img') #获取标签为div,class属性为big_img的对象 for link in links.find_all('img',src=re.compile(r'.jpg$')): #获取标签为img,无class属性,以.jpg结尾的src属性列表并迭代对象 path = r'D:\BaiduYunDownload\IMG' request.urlretrieve(link.attrs['src'],path+'\%s.jpg' % time.time()) #使用request.urlretrieve()直接将所有远程链接数据下载到本地,link.attr返回的是一个属性字典 if __name__=="__main__": url=input("请输入网址:") n=int(input("请输入页数:")) getImg(url) for i in range(2,n+1): url2=url[0:47]+"_"+str(i)+".html" getImg(url2)</code></pre> <h3 id="requests模块库"><strong>3. Requests模块库</strong></h3> <h3 id="lxml库xpath模块"><strong>4. lxml库XPath模块</strong></h3> <h3 id="python爬虫入门实战-1"><strong>Python爬虫入门实战</strong></h3> <pre><code>import requests from lxml import etree import re url=str(input('请输入网址:')) file_name=str(input('请输入文件夹名:')) headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" } count=0 flag=1 while flag: req =requests.get(url,headers=headers).content html=etree.HTML(req) element =html.xpath('//p/img/@src') for i in element: r = requests.get(i) count=count+1 print('下载第{}张'.format(count)) with open("D:/BaiduYunDownload/IMG/"+str(file_name)+str(count)+".jpg", "wb") as f: f.write(r.content) judge=html.xpath('//ul[@class="pagelist"]/li[last()]/@class') if judge==['thisclass']: flag=0 urls=html.xpath('//div/ul[@class="pagelist"]/li[last()]/a/@href')[0] url=url[:46]+urls print("完成")</code></pre><p><a href="http://www.bubuko.com/infodetail-3040512.html" title="Python归纳 | 爬虫基础知识,bubuko.com" style="color:#ffffff">Python归纳 | 爬虫基础知识</a></p><p>原文:https://www.cnblogs.com/crime/p/10790624.html</p></span> </div> <script type="text/javascript"> bubuko_load('content_after');</script> <div id="divcomment"> <div> <div class=" divtextaligncenter"> <div class="detailcai" id="infono"> <div class="detailcai1 colorboldlv"> 踩</div> <div class="detailcai2 colorboldlv"> (<span id="spanNo">0</span>)</div> </div> <div class="detailzan" id="infoyes"> <div class="detailzan1 colorboldCheng"> 赞</div> <div class="detailzan2 colorboldCheng"> (<span id="spanYes">0</span>)</div> </div> <div class="divfloatclear"> </div> </div> <div class="divtextalignright margintop10"> <div class="width100bi paddingleft10right10"> <span id="spanYesContent" class="colorboldCheng"></span>  <span id="spanNoContent" class="colorboldlv"></span>  <span id="spanBadContent" class="colorboldCheng"> </span> </div> </div> </div> <div class="divtextalignright margintop10"> <span class="detailjubao" id="infobad">举报</span> </div> <script type="text/javascript"> bubuko_load('comment_before');</script> <div id="comment" class="divtextalignleft margintop20"> <div class="detailpinglun1"> <span class="detailpinglun2 title6">评论</span> <span class="detailpinglun3">一句话评论(<span id="commentCount" class="colorboldCheng">0</span>)</span> </div> <div class="paddingtop20"> <div id="commentlistend" name="commentlistend" class="divtextaligncenter margintop20"> <span id="lblpage"></span> </div> </div> <div class="margintop20"> <form method="post" action="/ajaxjs/info_detail_commentadd.aspx"> <div class="divtextalignleft paddingtop20"> <div id="commenthf" class="divbackgroundcolor1"> </div> <div> <textarea name="tbcommentcontent" id="tbcommentcontent" disabled="disabled" class="tb" style="width: 680px; height: 120px;" ></textarea> </div> </div> <div class="divtextalignright paddingtop10 " style="display:none;"> <span id="addCommentTishi" class="colorboldCheng">登录后才能评论!</span> <span id="loginno"><input type="button" class="mbtn1" value="登录" onclick="location.href='login.aspx?returnUrl='+document.URL.replace(new RegExp('&', 'g'), '(_)')" /></span> </div> </form> </div> </div> </div> <script type="text/javascript"> bubuko_load('comment_after');</script> </div> </div> <div class="width30bi divfloatright"> <div class="paddingbottom20"> <!-- <script type="text/javascript"> document.write(unescape('%3Cdiv id="bdcs"%3E%3C/div%3E%3Cscript charset="utf-8" src="http://znsv.baidu.com/customer_search/api/js?sid=10743263978424259100') + '&plate_url=' + (encodeURIComponent(window.location.href)) + '&t=' + (Math.ceil(new Date() / 3600000)) + unescape('"%3E%3C/script%3E'));</script> --> </div> <script type="text/javascript"> bubuko_load('right_top');</script> <div class="width100bi divborder"> <div class="divtitle"> <div id="infofile1_div1" class="divfloatleft divtitlefont"> 分享档案</div> <div class="divfloatright"> <a href="/infotimemore.html" title="分享档案更多" class="colorCheng">更多></a> </div> <div class="divfloatclear"> </div> </div> <div class="divtextalignleft paddingleft10right10 margintop10bottom10 heightline30px"> <a class="taga" href="/infotime-20210923-1.html" title="2021年09月23日技术分享文章"> 2021年09月23日 (328)</a><br /> <a class="taga" href="/infotime-20210924-1.html" title="2021年09月24日技术分享文章"> 2021年09月24日 (313)</a><br /> <a class="taga" href="/infotime-20210917-1.html" title="2021年09月17日技术分享文章"> 2021年09月17日 (191)</a><br /> <a class="taga" href="/infotime-20210915-1.html" title="2021年09月15日技术分享文章"> 2021年09月15日 (369)</a><br /> <a class="taga" href="/infotime-20210916-1.html" title="2021年09月16日技术分享文章"> 2021年09月16日 (411)</a><br /> <a class="taga" href="/infotime-20210913-1.html" title="2021年09月13日技术分享文章"> 2021年09月13日 (439)</a><br /> <a class="taga" href="/infotime-20210911-1.html" title="2021年09月11日技术分享文章"> 2021年09月11日 (398)</a><br /> <a class="taga" href="/infotime-20210912-1.html" title="2021年09月12日技术分享文章"> 2021年09月12日 (393)</a><br /> <a class="taga" href="/infotime-20210910-1.html" title="2021年09月10日技术分享文章"> 2021年09月10日 (160)</a><br /> <a class="taga" href="/infotime-20210908-1.html" title="2021年09月08日技术分享文章"> 2021年09月08日 (222)</a><br /> </div> </div> <div class="width100bi margintop20 divborder"> <div class="divtitle"> <div id="infonew1_divtitle" class="divfloatleft divtitlefont">最新文章</div> <div class="divfloatright"> <a href="/info.html" id="infonew1_amore" class="colorCheng" title="最新文章更多>">更多></a></div> <div class="divfloatclear"> </div> </div> <div> <ul> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830785.html" title=" 6.0 scripts元素 1) 内嵌的 JavaScript 代码 <script type="text/javascript"> document.write("I love FishC.com!") </script> 2) 通过 src 属性引用来自外部代码文件 ..."> 2021/09/28 scripts  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830783.html" title=" 问题场景 后台不提供富文本存储,所以emoji表情入库会报错 需求要求前端在输入的时候过滤掉表情符号 全局的input 和富文本textarea输入框都需要过滤emoji表情 问题分析 1.每一个input写事件写正则校验代码量实在太多了还很麻烦;所以想用自定义全局指令,就不需要每个用到的地方都去引 ..."> vue自定义全局指令v-emoji限制input输入表情和特殊字符  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830781.html" title=" (1)今日计划 四则运算第二阶段 (2)源代码 package size; import java.util.*; import java.lang.Math; public class size { static int count=0; static int ccount=0; static i ..."> 9.26学习总结  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830780.html" title="vim操作 1. 只在指定的特定行中搜索 /pattern\%>27l # 搜索pattern, 搜索范围是27行以后, 其中l表示按行搜索 /pattern\%>27l\%<40l # 搜索pattern, 搜索范围是27行以后40行以前, 其中l表示按行搜索 注意, 不要在%>27l两边随便加空 ..."> vim操作  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830779.html" title=" 说明 主要是学习汇编 windows10 + notepad++ + DOSBox0.74 网上也有notepad++配置自动编译运行的教程,感觉不如手敲命令行原始链接来的快 中断和中断调用 就是调用Dos下的系统接口 中断一览表 MOV AH,09H INT 21H ..."> 深入理解计算机基础 第三章  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830778.html" title="记录一下自己将string作为参数传递的结果。(自己感觉与int等基本类型无异。) 1. string 以引用形式传递 #include <iostream>#include<string> using namespace std;void change_string(string& s){ cha ..."> C++ string 作为形参与引用传递(转)  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830777.html" title=" 常用加解密 1. md5 加密 import hashlib def private_passwd(passwd: str) -> str: return hashlib.md5(passwd.encode(encoding='UTF-8')).hexdigest() 2. base64 加解密 i ..."> python 加解密  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830775.html" title=" let array = [ { id: 1, name: "001", children: [ { id: 2, name: "002", }, ], }, { id: 3, name: "003", children: [] }, ]; function getFlatArr(arr) { ret ..."> JavaScript-对象数组里根据id获取name,对象可能有children属性  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830773.html" title=" SQL语句,追加内容: update 表名 set 字段=CONCAT(字段,'追加的内容') where 字段=? 参考链接:https://www.jb51.net/article/113454.htm ..."> SQL语句——保持现有内容在后面增加内容  <span class="colorlv">2022-05-27</span></a> </li> <li class="divullititle heightline25px divtextalignleft"><a href="/infodetail-3830769.html" title=" virsh [options]... [<command_string>]virsh [options]... <command> [args...] options: -c | --connect=URI hypervisor connection URI -d | --debug=NUM deb ..."> virsh命令文档  <span class="colorlv">2022-05-27</span></a> </li> </ul> </div> </div> <div class="width100bi margintop20 divborder"> <div class="divtitle"> <div id="jctop1_divtitle" class="divfloatleft divtitlefont">教程昨日排行</div> <div class="divfloatright"> <a href="/jiaocheng/" id="jctop1_amore" class="colorCheng">更多></a></div> <div class="divfloatclear"> </div> </div> <div class="divtextalignleft"> <ul> <li class="divullilist"> 1.<a href="/jiaocheng/detail-3742.html" title="list.reverse()" >list.reverse()</a></li> <li class="divullilist"> 2.<a href="/jiaocheng/detail-898.html" title="Django Admin 管理工具" >Django Admin 管理工具</a></li> <li class="divullilist"> 3.<a href="/jiaocheng/detail-1027.html" title="AppML 案例模型" >AppML 案例模型</a></li> <li class="divullilist"> 4.<a href="/jiaocheng/detail-51.html" title="HTML 标签列表(功能排序)" >HTML 标签列表(功能排序)</a></li> <li class="divullilist"> 5.<a href="/jiaocheng/detail-57.html" title="HTML 颜色名" >HTML 颜色名</a></li> <li class="divullilist"> 6.<a href="/jiaocheng/detail-64.html" title="HTML 语言代码" >HTML 语言代码</a></li> <li class="divullilist"> 7.<a href="/jiaocheng/detail-208.html" title="jQuery 事件" >jQuery 事件</a></li> <li class="divullilist"> 8.<a href="/jiaocheng/detail-303.html" title="jEasyUI 创建分割按钮" >jEasyUI 创建分割按钮</a></li> <li class="divullilist"> 9.<a href="/jiaocheng/detail-305.html" title="jEasyUI 创建复杂布局" >jEasyUI 创建复杂布局</a></li> <li class="divullilist"> 10.<a href="/jiaocheng/detail-336.html" title="jEasyUI 创建简单窗口" >jEasyUI 创建简单窗口</a></li> </ul> </div> </div> <script type="text/javascript"> bubuko_load('right_bottom');</script> </div> <div class="divfloatclear"> </div> </div> <script type="text/javascript"> bubuko_load('bottom');</script> <div class="width1000px divmargin0auto paddingtop20bottom20"> <div class="width1000px divborder margintop20"> <div class="youqingtitle"> <a title="友情链接">友情链接</a> </div> <div class="youqingcontent"> <a href='http://www.hubwiz.com/' title='汇智网在线编程学习' target='_blank'>汇智网</a>   <a href='http://www.5ibc.net' title='专注PHP程序员一站式免费学习站点' target='_blank'>PHP教程</a>   <a href='http://www.cnplugins.com/' title='插件网' target='_blank'>插件网</a>   <!--<a href='http://m.bubuko.com/doc3v35e/2022-03-31.html' title='王者荣耀' target='_blank'>王者荣耀</a> <a href='http://m.bubuko.com/doc0tx77/6.html' title='刺激战场' target='_blank'>刺激战场</a> <a href='http://m.bubuko.com/doc27/60.html' title='金铲铲' target='_blank'>金铲铲</a> <a href='http://m.bubuko.com/doc2022-03-31/rolne.html' title='冰封王座' target='_blank'>冰封王座</a> <a href='http://m.bubuko.com/doc20dq0/2022-03-31.html' title='魔兽世界' target='_blank'>魔兽世界</a> <a href='http://m.bubuko.com/docovgq9/2022-03-31.html' title='哔哩哔哩' target='_blank'>哔哩哔哩</a> <a href='http://m.bubuko.com/docuiwrn/27.html' title='狼人杀' target='_blank'>狼人杀</a> <a href='http://m.bubuko.com/doc91/74.html' title='元神' target='_blank'>元神</a> --> </div> </div> </div> <div class="bottomdiv"> <div class="width1000px divmargin0auto paddingtop20"> <div class="divfloatleft width500px"> <div class="height30px"> <a href="/about.html" title="bubuko.com关于我们">关于我们</a> - <a href="/contactus.html" title="bubuko.com联系我们">联系我们</a> - <a href="/guest.html" title="bubuko.com留言反馈">留言反馈</a> - 联系我们:wmxa8@hotmail.com </div> <div class="height30px"> © 2014 <a href="http://www.bubuko.com" title="bubuko.com技术分享">bubuko.com</a> 版权所有 </div> <div> <span class="colorlv">打开技术之扣,分享程序人生!</span> </div> <div class="paddingtop20 paddingbottom20"> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?5bb992e19249070395266c385ebea7c6"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>        <script> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </div> </div> <div class="divfloatright width500px"> </div> <div class="divfloatclear"> </div> </div> </div> <script type="text/javascript"> toptopmenu_i = "3"; infomenu_i = "4"; var mid = ''; var id = '3040512'; var idm = '82009e'; var commentitemcount = '0'; var memberhost = ''; prettyPrint(); </script> <script src="/js/infodetail.js" type="text/javascript" charset="utf-8"></script> <script src="/js/member.js" type="text/javascript" charset="utf-8"></script> <script src="/js/bubukojs.js" type="text/javascript"></script> </body> </html>