(数据科学学习手札31)基于Python的网络数据采集(初级篇)

一、简介

  在实际的业务中,我们手头的数据往往难以满足需求,这时我们就需要利用互联网上的资源来获取更多的补充数据,但是很多情况下,有价值的数据往往是没有提供源文件的直接下载渠道的(即所谓的API),这时我们该如何批量获取这些嵌入网页中的信息呢?

  这时网络数据采集就派上用处了,你通过浏览器可以观看到的绝大多数数据,都可以利用爬虫来获取,而所谓的爬虫,就是我们利用编程语言编写的脚本,根据其规模大小又分为很多种,本篇便要介绍基本的Python编写的爬虫脚本来进行单机形式的网络数据采集,这也是一个进阶的数据挖掘工程师或数据分析师的基本技能之一,大量的应用场景都会需要这种几乎可以毫无阻碍地获取数据的手段,譬如市场预测、机器语言翻译亦或是医疗诊断领域,通过对新闻网站、文章中的文本数据进行采集以进行进一步的数据挖掘工作,也是爬虫很常见的应用场景之一;

  本篇博客将通过介绍基础的爬虫知识,并附上两个实战项目的例子(爬取网易财经海南板块历史股票数据、爬取网易新闻多个分类板块的新闻文本数据),对基础的爬虫做一个小小的总结。

*本篇以jupyter notebook作为开发工具

 

二、建立连接

  为了抓取互联网上的数据资源,第一步显然是要建立起网络连接(即登入你的目标网址),在Python中,我们使用urllib.request中的urlopen()来建立起与目标网址的连接,这个函数可以用来打开并读取一个从网络获取的远程对象,可以轻松读取HTML文件、图像文件或其他寄存在网络端的文件,下面是一个简单的例子:

from urllib.request import urlopen

'''赋值我们需要登入的网址'''
html = urlopen('http://news.163.com/')

'''打印采集回的目标网页的源代码'''
print(html.read())

运行结果:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第1张图片

可以看出,通过上面非常简单的几行语句,我们就采集回http://news.163.com/的网页源代码,与浏览器中查看源代码的方式进行比较:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第2张图片

 (数据科学学习手札31)基于Python的网络数据采集(初级篇)_第3张图片

  可以看出,只通过这几行语句采集回的网页内容,和浏览器中展示的网页源码信息有很大的出入,这是因为我们通过urlopen只是传回来朴素的源代码,没有经过任何解析操作,下面介绍如何对返回的朴素的网页源码进行解析;

 

三、BeautifulSoup库

  通过上一节我们举的例子可以看出,我们需要对返回的网页源码进行结构化的解析,而BeautifulSoup就是这样一个神奇的第三方库,它通过对HTML标签进行定位,以达到格式化和组织复杂网络信息的目的,我们基于BeautifulSoup对上一节中的简单代码进行扩充:

from urllib.request import urlopen
from bs4 import BeautifulSoup

'''赋值我们需要登入的网址'''
html = urlopen('http://news.163.com/')

'''利用BeautifulSoup对朴素的网页源代码进行结构化解析(包括对utf编码的内容进行转码)'''
obj1 = BeautifulSoup(html.read())

'''打印采集回的目标网页的源代码'''
print(obj1)

运行结果:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第4张图片

可以看出这时我们得到的内容与我们之前在浏览器中查看的网页源代码一致(中文内容也被展示出来),更重要的是,我们已经对目标网页的结构进行了解析,意味着我们可以通过调用不同结构标签来查看相应内容:

print(obj1.html.h1)

print(obj1.html.title)

运行结果:

这对之后我们对所需内容的定位提取很有帮助,事实上,任何HTML、XML文件的任意节点信息都可以被提取出来,只要目标信息的附近有标记即可;

 

四、错误的处理策略

  相比大家都有经验,当我们登入某些网址时,因为网络不稳定或其它原因,会导致网页连接失败,而在我们的网络爬虫持续采集数据的过程中,因为网页数据格式不友好、网络服务器宕机、目标数据的标签寻找失败等原因,会导致你的爬虫中途因发生错误而中断,这在需要长时间工作的爬虫项目来说尤为关键;

  爬虫工作过程中常见的错误如下:

  对于urlopen的过程,服务器上不存在目标网页(或是获取页面的时候出现错误),这种异常发生时,程序会返回HTTP错误,这包含很多种详细的错误类型,但urlopen统一反馈“HTTPError”,于是乎利用Python中处理错误的try...except机制,就可以在爬虫遇到这种错误时,进行相应的处理方法(通常是选择跳过),下面是一个简单的例子:

from urllib.request import urlopen

'''创造一系列网址,其中第四个为伪造的不存在网站'''
html = ['http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=1',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=2',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=3',
        'http://www.pythonscraping.com/pages/page10000.html',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=4']

'''循环反馈对应网址的源代码信息'''
for i in range(5):
        token = urlopen(html[i])
        print(token.read()[:10])

这时我们没有进行错误处理,因此在程序运行到第四个网址时,会出现打不开网页的错误,如下:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第5张图片

HTTPError出现了,这时由于这个网址的打开失败,导致后续的任务都被迫中断,下面我们使用错误处理机制对这种遍历任务中的潜在错误风险进行处理:

from urllib.request import urlopen
from urllib.error import HTTPError#注意,这里需要import urllib中具体的错误类型

'''创造一系列网址,其中第四个为伪造的不存在网站'''
html = ['http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=1',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=2',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=3',
        'http://www.pythonscraping.com/pages/page10000.html',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=4']

'''循环反馈对应网址的源代码信息'''
for i in range(5):
    try:
        token = urlopen(html[i])
        print(token.read()[:10])
    except HTTPError as e:
        print('错误出现!跳过')

运行结果:

这样就可以对各种潜在的错误进行处理,而不打断整个程序的进行,但运行大的爬虫项目时,潜在的错误类型是多种多样的,一旦没有在程序开头import全对应的错误类型,依旧会因为未预料到的错误类型打断程序,这时我们可以利用try...except中的泛型错误Exception来识别所有错误类型,并打印具体的错误类型以作后期分析:

from urllib.request import urlopen

'''创造一系列网址,其中第四个为伪造的不存在网站'''
html = ['http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=1',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=2',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=3',
        'http://www.pythonscraping.com/pages/page10000.html',
        'http://quotes.money.163.com/trade/lsjysj_600221.html?year=2012&season=4']

'''循环反馈对应网址的源代码信息'''
for i in range(5):
    try:
        token = urlopen(html[i])
        print(token.read()[:10])
    except Exception as e:#泛型错误处理机制
        print('错误','< ',e,' >','出现!跳过')

运行结果:

可以看到,在利用Exception时,会处理所有可能的错误,非常方便;

 

五、目标内容的粗略提取(基于CSS)

  前面说了这么多,实际上还是在对我们的目的做铺垫,即介绍了 获取信息--抽取目标信息 这个过程中的获取信息部分,在获得了结构化的全量信息之后,我们就要开始着手如何提取其中想要的信息了;

  先普及一个知识:几乎每一个网站都会存在层叠样式报(cascading style sheet,CSS),这种机制使得浏览器和人类得以理解网页的层次内容,CSS可以让HTML元素呈现出差异化,使得不同的数据归属于其对应的标签下,我们再通过BeautifulSoup解析后的网页内容(带有各层次标签),利用对应内容的标签属性,即可有选择的获取我们想要的数据内容;

  我们用findAll()方法来对BeautifulSoup对象进行指定标签内容的提取,下面是一个简单的例子:

(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第6张图片

 

我们对http://sports.163.com/18/0504/10/DGV2STDA00058782.html这个新闻网页,先是提取它的新闻标题内容,通过观察网页源代码,发现其文章标题内容隐藏在标签下,于是利用findAll()对title标签内内容进行提取:</span></p> <p> </p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">from</span> urllib.request <span style="color: #0000ff;">import</span><span style="color: #000000;"> urlopen </span><span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span><span style="color: #000000;"> BeautifulSoup </span><span style="color: #800000;">'''</span><span style="color: #800000;">连接目标网址</span><span style="color: #800000;">'''</span><span style="color: #000000;"> html </span>= urlopen(<span style="color: #800000;">'</span><span style="color: #800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">将反馈回的网页源代码解析为BeautifulSoup对象</span><span style="color: #800000;">'''</span><span style="color: #000000;"> obj </span>=<span style="color: #000000;"> BeautifulSoup(html) </span><span style="color: #800000;">'''</span><span style="color: #800000;">提取obj对象下title标签内的内容</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>= obj.findAll(<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">打印结果</span><span style="color: #800000;">'''</span> <span style="color: #0000ff;">print</span>(text)</pre> </div> <p> </p> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><img src="http://img.e-com-net.com/image/info8/bdbad8ca0d0942ef96847e03140a1cc3.png" alt="" width="557" height="29"></span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  </span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  从上面的小例子中可以看出findAll()的强大功能,下面对其进行详细的介绍:</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  BeautifulSoup中的find()与findAll()是网页内容提取中最常用的两个函数,我们可以利用它们通过标签的不同属性轻松地过滤HTML页面,查找需要的单个或多个标签下的内容。</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  find()与findAll()用法几乎一样,先介绍findAll()的主要参数:</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">tag:这个参数传递字符串形式的单个标题标签或由多个标题标签组成的列表,如'title',['h1','h2','h3']</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">attributes:属性参数,接受用字典封装的一个标签的若干属性和对应的属性值,例如{'<span class="html-attribute-name">property':'<span class="html-attribute-value">og:description'}</span></span></span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><span class="html-attribute-name"><span class="html-attribute-value">recursive:bool型变量,默认为True,代表findAll会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签;如果设置为False,则findAll只查找文档的一级标签;</span></span></span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><span class="html-attribute-name"><span class="html-attribute-value">text:字符型输入,设置该参数以后,提取信息就不是用标签的属性,而是用标签的文本内容,即content中的内容来匹配</span></span></span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><span class="html-attribute-name"><span class="html-attribute-value">limit:范围限制参数,只用于findAll,换句话说,find等价于findAll的limit参数为1时的特殊情况,因为根据其他参数设定的条件返回的,是满足条件的所有标签下内容按顺序排列的一个序列,limit设置的值即控制了最终留下前多少个结果</span></span></span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><span class="html-attribute-name"><span class="html-attribute-value">keyword:这个参数的用法不是对keyword赋值,而是将你感兴趣的标签内属性声明项,如<span class="html-attribute-name">name="<span class="html-attribute-value">keywords"这样的,在findAll中附加上</span></span></span></span></span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><span class="html-attribute-name"><span class="html-attribute-value"><span class="html-attribute-name"><span class="html-attribute-value">下面还是基于之前举例子的那篇新闻网页,对findAll进行演示:</span></span></span></span></span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><span class="html-attribute-name"><span class="html-attribute-value"><span class="html-attribute-name"><span class="html-attribute-value">单个标题标签内容的粗略提取:</span></span></span></span></span></p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">from</span> urllib.request <span style="color: #0000ff;">import</span><span style="color: #000000;"> urlopen </span><span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span><span style="color: #000000;"> BeautifulSoup html </span>=urlopen( <span style="color: #800000;">'</span><span style="color: #800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) obj </span>= BeautifulSoup(html,<span style="color: #800000;">'</span><span style="color: #800000;">lxml</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">获取标签为<p>的内容</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>= obj.findAll(<span style="color: #800000;">'</span><span style="color: #800000;">p</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #0000ff;">print</span>(text)</pre> </div> <p style="text-align: left;"> </p> <p style="text-align: left;"> </p> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/748b52de23a14ed2a68ae254b2698959.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/748b52de23a14ed2a68ae254b2698959.jpg" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第7张图片" width="650" height="192" style="border:1px solid black;"></a></span></p> <p><span style="font-size: 14pt;">多个标签内容的捆绑提取:</span></p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">from</span> urllib.request <span style="color: #0000ff;">import</span><span style="color: #000000;"> urlopen </span><span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span><span style="color: #000000;"> BeautifulSoup html </span>=urlopen( <span style="color: #800000;">'</span><span style="color: #800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) obj </span>= BeautifulSoup(html,<span style="color: #800000;">'</span><span style="color: #800000;">lxml</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">保存多个标题标签的列表</span><span style="color: #800000;">'''</span><span style="color: #000000;"> tag </span>= [<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">meta</span><span style="color: #800000;">'</span><span style="color: #000000;">] </span><span style="color: #800000;">'''</span><span style="color: #800000;">获取tag中标签的内容</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>=<span style="color: #000000;"> obj.findAll(tag) </span><span style="color: #0000ff;">print</span>(text)</pre> </div> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/83e20f059345403aa15908bf7684c123.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/83e20f059345403aa15908bf7684c123.jpg" alt="" width="650" height="83"></a></span></p> <p><span style="font-size: 14pt;">对指定标签下指定属性值对应内容的提取:</span></p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">from</span> urllib.request <span style="color: #0000ff;">import</span><span style="color: #000000;"> urlopen </span><span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span><span style="color: #000000;"> BeautifulSoup html </span>=urlopen( <span style="color: #800000;">'</span><span style="color: #800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) obj </span>= BeautifulSoup(html,<span style="color: #800000;">'</span><span style="color: #800000;">lxml</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">获取meta标签下属性name为author的对应内容</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>= obj.findAll(<span style="color: #800000;">'</span><span style="color: #800000;">meta</span><span style="color: #800000;">'</span>,{<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">author</span><span style="color: #800000;">'</span><span style="color: #000000;">}) </span><span style="color: #0000ff;">print</span>(text)</pre> </div> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/f9fc5ea45f1546d9b4cc8f9692d5381b.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/f9fc5ea45f1546d9b4cc8f9692d5381b.png" alt="" width="350" height="45"></a></span></p> <p> </p> <p><span style="font-size: 18pt;">六、正则表达式</span></p> <p><span style="font-size: 14pt;">  即使你之前完全没有接触过网络爬虫,也可能接触过正则表达式(regular expression,简称regex),之所以叫正则表达式,是因为它们可以识别正则字符串(regular string),通俗的理解就是,我只识别我编写的正则表达式所匹配的内容,而忽视不符合我的表达式所构造的规则的字符串,这在很多方面都十分的方便;</span></p> <p><span style="font-size: 14pt;">  正则字符串是任意可以用一系列线性规则构成的字符串,例如:</span></p> <p><span style="font-size: 14pt;">  1、字母“a”至少出现一次;</span></p> <p><span style="font-size: 14pt;">  2、后面接上重复5次的“b”;</span></p> <p><span style="font-size: 14pt;">  3、后面再接上重复任意偶数次的字母“c”;</span></p> <p><span style="font-size: 14pt;">  4、最后一位字母是“d”或没有。</span></p> <p><span style="font-size: 14pt;">满足上述组合条件的字符串有无数个,如“aaabbbbbccccd”,“abbbbbcc”等,相信你应该理解了,正则表达式就是用一个对于目标语句的格式普适的规则,来识别目标内容。</span></p> <p><span style="font-size: 14pt;">  你可以将正则表达式理解为SQL中的LIKE运算符后跟着的通配符,还是以上面介绍过的组合条件为例,用正则表达式来表示:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">aa*bbbbb(cc)*(d|)</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  首先,开头的a表示a出现一次,a*表示a出现任意次,因此aa*的组合代表a至少出现一次;bbbbb表示连续出现5次b;(cc)*表示cc出现任意次,对应重复任意次(包括0次)的c;(d|)表示出现d或无任何字符,对应“最后一位是字母d或没有”,这样一个由若干规则按顺序组合起来的字符串,就是正则字符串;</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">*有很多网站可以在线测试你的正则表达式,我喜欢用的是http://regexpal.com.s3-website-us-east-1.amazonaws.com/?_ga=2.164205119.1679442026.1514793856-2027450969.1514793856</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  再举一个更常见的正则表达式使用场景——识别邮箱,以我个人的邮箱为例:pengzyill@foxmail.com,这是个常见的邮箱格式,若要编写正则表达式来识别它,就会按顺序用到以下识别规则:</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  1、邮箱的第一部分至少包括一种内容:大写字母、小写字母、数字0-9、点号.、加号+或下划线_,因此为了识别这一部分,我们构造的正则字符串如下:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">[A-Za-z0-9\.+_]+</span></p> <p style="text-align: left;"> <span style="font-size: 14pt;">[]中放入的内容是所有可能出现的内容的最简形式,A-Z表示所有大写字母,a-z表示所有小写字母,0-9表示所有数字,\.表示点号.(这里用\转义),+表示加号,_表示下划线,[]后紧跟的+表示前面[]内的所有部件可以出现多次,且至少有一种部件至少出现1次,可以看出,非常简洁;</span><span style="font-size: 14pt;"><br></span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  2、紧跟着,会出现一个@符号,很简单,对应的正则字符串为:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">@</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  3、在@之后,是指明邮箱所属域名的部分,由大小写字母组成,如我的邮箱中的foxmail,于是对应的正则字符串为:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">[A-Za-z]+</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  4、紧跟着是一个点号,即:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">\.</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  5、最后一部分,是邮箱地址的顶级域名,如com,org,edu或net等,这是四种最常见的,因此以这四种作为全部(虽然有些以偏概全),对应的正则字符串如下:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">(com|org|edu|net)</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">将上述的子正则字符串按照顺序连接起来,便得到了我们的用于识别邮箱地址的正则字符串:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;">[A-Za-z0-9\.+_]+@[A-Za-z]+\.(com|org|edu|net)</span></p> <p style="text-align: left;"> <span style="font-size: 14pt;">我们在前面提到的在线测试网站中测试一下~</span></p> <p style="text-align: left;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/7772acdbc15343bd9d075ac1df55e9d2.png" target="_blank"><img style="display: block; margin-left: auto; margin-right: auto;;border:1px solid black;" src="http://img.e-com-net.com/image/info8/7772acdbc15343bd9d075ac1df55e9d2.png" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第8张图片" width="628" height="328"></a></span></p> <p style="text-align: left;"><span style="font-size: 14pt;">可以看出,我的邮箱地址被准确的识别出来(完全被黄色底纹包裹),你也可以试试你自己的邮箱地址;所以,在使用正则表达式之前,最好分块的理清楚各个部分需要对应的正则字符串,这对提高效率很有帮助。</span></p> <p style="text-align: left;"><span style="font-size: 14pt;">  下面用一些简单的说明和例子来总结一下正则表达式中的常用符号:</span></p> <table style="height: 712px; width: 651px;" border="0" align="center"> <tbody> <tr> <td style="text-align: center;"><span style="font-size: 14px;">符号</span></td> <td style="text-align: center;"><span style="font-size: 14px;">含义</span></td> <td style="text-align: center;"><span style="font-size: 14px;">例子</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配结果</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">*</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配前面的单个字符、子表达式或括号里的所有字符0次或多次</span></td> <td style="text-align: center;"><span style="font-size: 14px;">a*(bb)*</span></td> <td style="text-align: center;"><span style="font-size: 14px;">aaaa  aabbbb</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">+</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配前面的字符、子表达式或括号里的所有字符至少1次</span></td> <td style="text-align: center;"><span style="font-size: 14px;">a+b+</span></td> <td style="text-align: center;"><span style="font-size: 14px;">ab  aabbb</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">[]</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配括号中任意一个字符(配合*实现多次出现的匹配)</span></td> <td style="text-align: center;"><span style="font-size: 14px;">[A-Z]*</span></td> <td style="text-align: center;"><span style="font-size: 14px;">LOVE  PEACE</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">()</span></td> <td style="text-align: center;"><span style="font-size: 14px;">表达式编组(类似数学运算,()里的规则会优先运行)</span></td> <td style="text-align: center;"><span style="font-size: 14px;">(a*b)*</span></td> <td style="text-align: center;"><span style="font-size: 14px;">aabab  abababab</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">{m,n}</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配前面的字符、子表达式或括号里的字符m到n次(包含m或n)</span></td> <td style="text-align: center;"><span style="font-size: 14px;">a{2,3}b{2,3}</span></td> <td style="text-align: center;"><span style="font-size: 14px;">aabbb  aaabb</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">[^]</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配任意一个不在中括号里的字符</span></td> <td style="text-align: center;"><span style="font-size: 14px;">[^A-Z]*</span></td> <td style="text-align: center;"><span style="font-size: 14px;">apple  love%++</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">|</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配任意<span style="color: #ff0000;">一个</span>由竖线|分割的字符、子表达式</span></td> <td style="text-align: center;"><span style="font-size: 14px;">b(a|i|e)d</span></td> <td style="text-align: center;"><span style="font-size: 14px;">bad  bid  bed</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">.</span></td> <td style="text-align: center;"><span style="font-size: 14px;">匹配任意单个字符(包括符号、数字和空格等)</span></td> <td style="text-align: center;"><span style="font-size: 14px;">b.d</span></td> <td style="text-align: center;"><span style="font-size: 14px;">bed  b?d  bod</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">^</span></td> <td style="text-align: center;"><span style="font-size: 14px;">表示以某个字符或子表达式开头的字符串</span></td> <td style="text-align: center;"><span style="font-size: 14px;">^a</span></td> <td style="text-align: center;"><span style="font-size: 14px;">adshdjsh  a?di</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">\</span></td> <td style="text-align: center;"><span style="font-size: 14px;">转义字符(把有特殊含义的字符转换成字面形式,譬如本表中的一些常用符号)</span></td> <td style="text-align: center;"><span style="font-size: 14px;">\.\|\\</span></td> <td style="text-align: center;"><span style="font-size: 14px;">.|\</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">$</span></td> <td style="text-align: center;"><span style="font-size: 14px;">常用于正则表达式的末尾,表示“从字符串的末端匹配”,如果不使用它,每个正则表达式实际上都相当于外套一个.*,默认从字符串开头进行匹配。可以将这个符号视为^的反义词</span></td> <td style="text-align: center;"><span style="font-size: 14px;">[A-Z]*[a-z]*$</span></td> <td style="text-align: center;"><span style="font-size: 14px;">ABCabc</span></td> </tr> <tr> <td style="text-align: center;"><span style="font-size: 14px;">?!</span></td> <td style="text-align: center;"><span style="font-size: 14px;">表示“不包含”,这个符号通常放在字符或正则表达式前面,表示指定字符不可以出现在目标字符串中,若字符在字符串的不规则部位出现,则需要在整个字符串中排除某个字符,就需要加上^与$符号</span></td> <td style="text-align: center;"><span style="font-size: 14px;">^((?![A-Z]).)*$</span></td> <td style="text-align: center;"><span style="font-size: 14px;">nojoasdn-\</span></td> </tr> </tbody> </table> <p style="text-align: center;"> </p> <p> <span style="font-size: 18pt;">七、正则表达式与BeautifulSoup</span><span style="font-size: 18pt;"><br></span></p> <p><span style="font-size: 14pt;">  基于前面介绍的正则表达式,下面我们来介绍如何将正则表达式与BeautifulSoup结合起来:</span></p> <p><span style="font-size: 14pt;">  这里要使用到一个新的模块——re,这时Python中专门进行正则表达式相关操作的模块,为了与BeautifulSoup结合起来,我们需要进行的操作是将re.compile('正则表达式内容')作为findAll内适配参数的输入值,即可将以前确切赋参的方法,转换为利用正则表达式进行模式赋参,这大大提高了findAll对网页内容提取的自由度和效率,下面是几个简单的例子:</span></p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">from</span> urllib.request <span style="color: #0000ff;">import</span><span style="color: #000000;"> urlopen </span><span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span><span style="color: #000000;"> BeautifulSoup </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> re html </span>=urlopen( <span style="color: #800000;">'</span><span style="color: #800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) obj </span>= BeautifulSoup(html,<span style="color: #800000;">'</span><span style="color: #800000;">lxml</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">匹配meta标签下,name属性值为k开头,紧跟着任意数目小写字母</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>= obj.findAll(<span style="color: #800000;">'</span><span style="color: #800000;">meta</span><span style="color: #800000;">'</span>,{<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:re.compile(<span style="color: #800000;">'</span><span style="color: #800000;">k[a-z]*</span><span style="color: #800000;">'</span><span style="color: #000000;">)}) </span><span style="color: #0000ff;">print</span>(text)</pre> </div> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/b694203dec4c4a5c9bec375e00d3f030.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/b694203dec4c4a5c9bec375e00d3f030.png" alt="" width="441" height="41"></a></span></p> <p><span style="font-size: 14pt;">接下来我们来实现更复杂一些的数据爬取,我在本篇博客中反复举例的网页是一篇关于台球的新闻报道,那么我们最关注的信息就应该是新闻的正文内容,下面我们就将针对此目的进行数据的爬取:</span></p> <p><span style="font-size: 14pt;">  通过对网页源代码的观察后,确定了新闻内容属于标签p下,因此利用正则表达式配合findAll爬取这部分内容,这里.*?表示匹配所有类型任意出现次数的字符:</span></p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">from</span> urllib.request <span style="color: #0000ff;">import</span><span style="color: #000000;"> urlopen </span><span style="color: #0000ff;">from</span> bs4 <span style="color: #0000ff;">import</span><span style="color: #000000;"> BeautifulSoup </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> re html </span>=urlopen( <span style="color: #800000;">'</span><span style="color: #800000;">http://sports.163.com/18/0504/10/DGV2STDA00058782.html</span><span style="color: #800000;">'</span><span style="color: #000000;">) obj </span>= BeautifulSoup(html,<span style="color: #800000;">'</span><span style="color: #800000;">lxml</span><span style="color: #800000;">'</span><span style="color: #000000;">) </span><span style="color: #800000;">'''</span><span style="color: #800000;">匹配p标签下的内容</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>= obj.findAll(<span style="color: #800000;">'</span><span style="color: #800000;">p</span><span style="color: #800000;">'</span>,text=re.compile(<span style="color: #800000;">'</span><span style="color: #800000;">.*?</span><span style="color: #800000;">'</span><span style="color: #000000;">)) </span><span style="color: #800000;">'''</span><span style="color: #800000;">打印未经处理的内容</span><span style="color: #800000;">'''</span> <span style="color: #0000ff;">print</span>(text)</pre> </div> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/bf30f2963f044aefb412832c01de46e6.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/bf30f2963f044aefb412832c01de46e6.jpg" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第9张图片" width="650" height="343" style="border:1px solid black;"></a></span></p> <p><span style="font-size: 14pt;">虽然将全部新闻内容爬取了下来,但其中参杂着许多<>包裹的标签内容,下面我们利用re.sub来对这些无关内容进行处理:</span></p> <div class="cnblogs_code"> <pre><span style="color: #800000;">'''</span><span style="color: #800000;">将爬下来的粗略内容转为字符串形式</span><span style="color: #800000;">'''</span><span style="color: #000000;"> text </span>=<span style="color: #000000;"> str(text) </span><span style="color: #800000;">'''</span><span style="color: #800000;">利用re.sub将所有的<>及内部信息替换为空字符,等价于将这些干扰部分删去</span><span style="color: #800000;">'''</span> <span style="color: #0000ff;">print</span>(re.sub(<span style="color: #800000;">'</span><span style="color: #800000;"><.*?></span><span style="color: #800000;">'</span>,<span style="color: #800000;">''</span>,text))</pre> </div> <p><span style="font-size: 14pt;">运行结果:</span></p> <p style="text-align: center;"><span style="font-size: 14pt;"><a href="http://img.e-com-net.com/image/info8/0e7ca1a34900412da6f584d9a648ce65.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0e7ca1a34900412da6f584d9a648ce65.jpg" alt="(数据科学学习手札31)基于Python的网络数据采集(初级篇)_第10张图片" width="650" height="338" style="border:1px solid black;"></a></span></p> <p><span style="font-size: 14pt;">相信你此时一定在惊叹re这个模块的功能之强大,接下来的一篇博客,我就将详细介绍re模块的常见功能和特性;</span></p> <p> </p> <p><span style="font-size: 14pt;">  以上就是关于Python网络爬虫的初级知识,今后会继续更进阶的介绍,敬请期待。</span></p> <p> </p> <p style="text-align: left;"> </p> <p> </p> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1226900121791336448"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:((数据科学学习手札31)基于Python的网络数据采集(初级篇))</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835514462770130944.htm" title="斤斤计较的婚姻到底有多难?" target="_blank">斤斤计较的婚姻到底有多难?</a> <span class="text-muted">白心之岂必有为</span> <div>很多人私聊我会问到在哪个人群当中斤斤计较的人最多?我都会回答他,一般婚姻出现问题的斤斤计较的人士会非常多,以我多年经验,在婚姻落的一塌糊涂的人当中,斤斤计较的人数占比在20~30%以上,也就是说10个婚姻出现问题的斤斤计较的人有2-3个有多不减。在婚姻出问题当中,有大量的心理不平衡的、尖酸刻薄的怨妇。在婚姻中仅斤斤计较有两种类型:第一种是物质上的,另一种是精神上的。在物质与精神上抠门已经严重的影响</div> </li> <li><a href="/article/1835514464028422144.htm" title="情绪觉察日记第37天" target="_blank">情绪觉察日记第37天</a> <span class="text-muted">露露_e800</span> <div>今天是家庭关系规划师的第二阶最后一天,慧萍老师帮我做了个案,帮我处理了埋在心底好多年的一份恐惧,并给了我深深的力量!这几天出来学习,爸妈过来婆家帮我带小孩,妈妈出于爱帮我收拾东西,并跟我先生和婆婆产生矛盾,妈妈觉得他们没有照顾好我…。今晚回家见到妈妈,我很欣赏她并赞扬她,妈妈说今晚要跟我睡我说好,当我们俩躺在床上准备睡觉的时候,我握着妈妈的手对她说:妈妈这几天辛苦你了,你看你多利害把我们的家收拾得</div> </li> <li><a href="/article/1835514335561084928.htm" title="芦花鞋一四" target="_blank">芦花鞋一四</a> <span class="text-muted">许叶晗</span> <div>又是在一个寒冷的夏日里,青铜和葵花决定今天一起去卖芦花鞋,奶奶亲手给他们做了一碗热乎乎的粥对他们说:“就靠你们两挣生活费了这碗粥赶紧趁热喝了吧!”于是青铜和葵花喝完了奶奶给她们做的粥,就准备去镇上卖卢花鞋,这回青铜和葵花穿着新的芦花鞋来到了镇上。青铜这回看到了很多人都在卖,用手势表达对葵花说:“这回有好多人在抢我们生意呢!我们必须得吆喝起来。”葵花点了点头。可是谁知他们也大声的叫,卖芦花喽!卖芦花</div> </li> <li><a href="/article/1835514307744460800.htm" title="QQ群采集助手,精准引流必备神器" target="_blank">QQ群采集助手,精准引流必备神器</a> <span class="text-muted">2401_87347160</span> <a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以</div> </li> <li><a href="/article/1835514207114719232.htm" title="关于沟通这件事,项目经理不需要每次都面对面进行" target="_blank">关于沟通这件事,项目经理不需要每次都面对面进行</a> <span class="text-muted">流程大师兄</span> <div>很多项目经理都会遇到这样的问题,项目中由于事情太多,根本没有足够的时间去召开会议,那在这种情况下如何去有效地管理项目中的利益相关者?当然,不建议电子邮件也不需要开会的话,建议可以采取下面几种方式来形成有效的沟通,这几种方式可以帮助你努力的通过各种办法来保持和各方面的联系。项目经理首先要问自己几个问题,项目中哪些利益相关者是必须要进行沟通的?可以列出项目中所有的利益相关者清单,同时也整理出项目中哪些</div> </li> <li><a href="/article/1835513803861749760.htm" title="机器学习与深度学习间关系与区别" target="_blank">机器学习与深度学习间关系与区别</a> <span class="text-muted">ℒℴѵℯ心·动ꦿ໊ོ꫞</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>一、机器学习概述定义机器学习(MachineLearning,ML)是一种通过数据驱动的方法,利用统计学和计算算法来训练模型,使计算机能够从数据中学习并自动进行预测或决策。机器学习通过分析大量数据样本,识别其中的模式和规律,从而对新的数据进行判断。其核心在于通过训练过程,让模型不断优化和提升其预测准确性。主要类型1.监督学习(SupervisedLearning)监督学习是指在训练数据集中包含输入</div> </li> <li><a href="/article/1835513701143244800.htm" title="铭刻于星(四十二)" target="_blank">铭刻于星(四十二)</a> <span class="text-muted">随风至</span> <div>69夜晚,绍敏同学做完功课后,看了眼房外,没听到动静才敢从书包的夹层里拿出那个心形纸团。折痕压得很深,都有些旧了,想来是已经写好很久了。绍敏同学慢慢地、轻轻地捏开折叠处,待到全部拆开后,又反复抚平纸张,然后仔细地一字字默看。只是开头的三个字是第一次看到,让她心漏跳了几拍。“亲爱的绍敏:从四年级的时候,我就喜欢你了,但是我一直不敢说,怕影响你学习。六年级的时候听说有人跟你表白,你接受了,我很难过,但</div> </li> <li><a href="/article/1835513570171908096.htm" title="底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说" target="_blank">底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说</a> <span class="text-muted">造命者说</span> <div>底层逆袭到底有多难,不甘平凡的你准备好了吗?让吴起给你说说我叫吴起,生于公元前440年的战国初期,正是群雄并起、天下纷争不断的时候。后人说我是军事家、政治家、改革家,是兵家代表人物。评价我一生历仕鲁、魏、楚三国,通晓兵家、法家、儒家三家思想,在内政军事上都有极高的成就。周安王二十一年(公元前381年),因变法得罪守旧贵族,被人乱箭射死。我出生在卫国一个“家累万金”的富有家庭,从年轻时候起就不甘平凡</div> </li> <li><a href="/article/1835513571501502464.htm" title="2020-01-25" target="_blank">2020-01-25</a> <span class="text-muted">晴岚85</span> <div>郑海燕坚持分享590天2020.1.24在生活中只存在两个问题。一个问题是:你知道想要达成的目标是什么,但却不知道如何才能达成;另一个问题是:你不知道你的目标是什么。前一个是行动的问题,后一个是结果的问题。通过制定具体的下一步行动,可以解决不知道如何开始行动的问题。而通过去想象结果,对结果做预估,可以解决找不着目标的问题。对于所有吸引我们注意力,想要完成的任务,你可以先想象一下,预期的结果究竟是什</div> </li> <li><a href="/article/1835513568917811200.htm" title="随笔 | 仙一般的灵气" target="_blank">随笔 | 仙一般的灵气</a> <span class="text-muted">海思沧海</span> <div>仙岛今天,我看了你全部,似乎已经进入你的世界我不知道,这是否是梦幻,还是你仙一般的灵气吸引了我也许每一个人都要有一份属于自己的追求,这样才能够符合人生的梦想,生活才能够充满着阳光与快乐我不知道,我为什么会这样的感叹,是在感叹自己的人生,还是感叹自己一直没有孜孜不倦的追求只感觉虚度了光阴,每天活在自己的梦中,活在一个不真实的世界是在逃避自己,还是在逃避周围的一切有时候我嘲笑自己,嘲笑自己如此的虚无,</div> </li> <li><a href="/article/1835513567663714304.htm" title="想家" target="_blank">想家</a> <span class="text-muted">爆米花机</span> <div>也许不同于大家对家乡的思念,我对家乡甚至是疯狂的不舍。还未踏出车站就感觉到幸福,我享受这里的夕阳、这里的浓烈柴火味、这里每一口家常菜。我是宅女,我贪恋家的安逸。刚刚踏出大学校门,初出茅庐,无法适应每年只能国庆和春节回家。我焦虑、失眠、无端发脾气,是无法适应工作的节奏,是无法接受我将一步步离开家乡的事实。我不想承认自己胸无大志,选择再次踏上征程。图片发自App</div> </li> <li><a href="/article/1835513551624695808.htm" title="【iOS】MVC设计模式" target="_blank">【iOS】MVC设计模式</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a> <div>MVC前言如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architecturalpattern),属于编程的方法论。MVC模式就是架构模式的一种。它是Apple官方推荐的App开发架构,也是一般开发者最先遇到、最经典的架构。MVC各层controller层Controller/ViewController/VC(控制器)负责协调Model和View,处理大部分逻辑它将数据从Mod</div> </li> <li><a href="/article/1835513551142350848.htm" title="OC语言多界面传值五大方式" target="_blank">OC语言多界面传值五大方式</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言在完成暑假仿写项目时,遇到了许多需要用到多界面传值的地方,这篇博客来总结一下比较常用的五种多界面传值的方式。属性传值属性传值一般用前一个界面向后一个界面传值,简单地说就是通过访问后一个视图控制器的属性来为它赋值,通过这个属性来做到从前一个界面向后一个界面传值。首先在后一个界面中定义属性@interfaceBViewController:UIViewController@propertyNSSt</div> </li> <li><a href="/article/1835513440525971456.htm" title="一百九十四章. 自相矛盾" target="_blank">一百九十四章. 自相矛盾</a> <span class="text-muted">巨木擎天</span> <div>唉!就这么一夜,林子感觉就像过了很多天似的,先是回了阳间家里,遇到了那么多不可思议的事情儿。特别是小伙伴们,第二次与自己见面时,僵硬的表情和恐怖的气氛,让自己如坐针毡,打从心眼里难受!还有东子,他现在还好吗?有没有被人欺负?护城河里的小鱼小虾们,还都在吗?水不会真的干枯了吧?那对相亲相爱漂亮的太平鸟儿,还好吧!春天了,到了做窝、下蛋、喂养小鸟宝宝的时候了,希望它们都能够平安啊!虽然没有看见家人,也</div> </li> <li><a href="/article/1835513424734416896.htm" title="UI学习——cell的复用和自定义cell" target="_blank">UI学习——cell的复用和自定义cell</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添</div> </li> <li><a href="/article/1835512920797179904.htm" title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a> <span class="text-muted">软件技术NINI</span> <a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/1.htm">vue案例</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div> </li> <li><a href="/article/1835512809883004928.htm" title="10月|愿你的青春不负梦想-读书笔记-01" target="_blank">10月|愿你的青春不负梦想-读书笔记-01</a> <span class="text-muted">Tracy的小书斋</span> <div>本书的作者是俞敏洪,大家都很熟悉他了吧。俞敏洪老师是我行业的领头羊吧,也是我事业上的偶像。本日摘录他书中第一章中的金句:『一个人如果什么目标都没有,就会浑浑噩噩,感觉生命中缺少能量。能给我们能量的,是对未来的期待。第一件事,我始终为了进步而努力。与其追寻全世界的骏马,不如种植丰美的草原,到时骏马自然会来。第二件事,我始终有阶段性的目标。什么东西能给我能量?答案是对未来的期待。』读到这里的时候,我便</div> </li> <li><a href="/article/1835512542735200256.htm" title="C语言宏函数" target="_blank">C语言宏函数</a> <span class="text-muted">南林yan</span> <a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>一、什么是宏函数?通过宏定义的函数是宏函数。如下,编译器在预处理阶段会将Add(x,y)替换为((x)*(y))#defineAdd(x,y)((x)*(y))#defineAdd(x,y)((x)*(y))intmain(){inta=10;intb=20;intd=10;intc=Add(a+d,b)*2;cout<<c<<endl;//800return0;}二、为什么要使用宏函数使用宏函数</div> </li> <li><a href="/article/1835512305320816640.htm" title="地推话术,如何应对地推过程中家长的拒绝" target="_blank">地推话术,如何应对地推过程中家长的拒绝</a> <span class="text-muted">校师学</span> <div>相信校长们在做地推的时候经常遇到这种情况:市场专员反馈家长不接单,咨询师反馈难以邀约这些家长上门,校区地推疲软,招生难。为什么?仅从地推层面分析,一方面因为家长受到的信息轰炸越来越多,对信息越来越“免疫”;而另一方面地推人员的专业能力和营销话术没有提高,无法应对家长的拒绝,对有意向的家长也不知如何跟进,眼睁睁看着家长走远;对于家长的疑问,更不知道如何有技巧地回答,机会白白流失。由于回答没技巧和专业</div> </li> <li><a href="/article/1835512178023690240.htm" title="谢谢你们,爱你们!" target="_blank">谢谢你们,爱你们!</a> <span class="text-muted">鹿游儿</span> <div>昨天家人去泡温泉,二个孩子也带着去,出发前一晚,匆匆下班,赶回家和孩子一起收拾。饭后,我拿出笔和本子(上次去澳门时做手帐的本子)写下了1\2\3\4\5\6\7\8\9,让后让小壹去思考,带什么出发去旅游呢?她在对应的数字旁边画上了,泳衣、泳圈、肖恩、内衣内裤、tapuy、拖鞋……画完后,就让她自己对着这个本子,将要带的,一一带上,没想到这次带的书还是这本《便便工厂》(晚上姑婆发照片过来,妹妹累得</div> </li> <li><a href="/article/1835511911769272320.htm" title="C语言如何定义宏函数?" target="_blank">C语言如何定义宏函数?</a> <span class="text-muted">小九格物</span> <a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>在C语言中,宏函数是通过预处理器定义的,它在编译之前替换代码中的宏调用。宏函数可以模拟函数的行为,但它们不是真正的函数,因为它们在编译时不会进行类型检查,也不会分配存储空间。宏函数的定义通常使用#define指令,后面跟着宏的名称和参数列表,以及宏展开后的代码。宏函数的定义方式:1.基本宏函数:这是最简单的宏函数形式,它直接定义一个表达式。#defineSQUARE(x)((x)*(x))2.带参</div> </li> <li><a href="/article/1835511912192897024.htm" title="微服务下功能权限与数据权限的设计与实现" target="_blank">微服务下功能权限与数据权限的设计与实现</a> <span class="text-muted">nbsaas-boot</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>在微服务架构下,系统的功能权限和数据权限控制显得尤为重要。随着系统规模的扩大和微服务数量的增加,如何保证不同用户和服务之间的访问权限准确、细粒度地控制,成为设计安全策略的关键。本文将讨论如何在微服务体系中设计和实现功能权限与数据权限控制。1.功能权限与数据权限的定义功能权限:指用户或系统角色对特定功能的访问权限。通常是某个用户角色能否执行某个操作,比如查看订单、创建订单、修改用户资料等。数据权限:</div> </li> <li><a href="/article/1835511912843014144.htm" title="理解Gunicorn:Python WSGI服务器的基石" target="_blank">理解Gunicorn:Python WSGI服务器的基石</a> <span class="text-muted">范范0825</span> <a class="tag" taget="_blank" href="/search/ipython/1.htm">ipython</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico</div> </li> <li><a href="/article/1835511669476913152.htm" title="小丽成长记(四十三)" target="_blank">小丽成长记(四十三)</a> <span class="text-muted">玲玲54321</span> <div>小丽发现,即使她好不容易调整好自己的心态下一秒总会有不确定的伤脑筋的事出现,一个接一个的问题,人生就没有停下的时候,小问题不断出现。不过她今天看的书,她接受了人生就是不确定的,厉害的人就是不断创造确定性,在Ta的领域比别人多的确定性就能让自己脱颖而出,显示价值从而获得的比别人多的利益。正是这样的原因,因为从前修炼自己太少,使得她现在在人生道路上打怪起来困难重重,她似乎永远摆脱不了那种无力感,有种习</div> </li> <li><a href="/article/1835511542284644352.htm" title="学点心理知识,呵护孩子健康" target="_blank">学点心理知识,呵护孩子健康</a> <span class="text-muted">静候花开_7090</span> <div>昨天听了华中师范大学教育管理学系副教授张玲老师的《哪里才是学生心理健康的最后庇护所,超越教育与技术的思考》的讲座。今天又重新学习了一遍,收获匪浅。张玲博士也注意到了当今社会上的孩子由于心理问题导致的自残、自杀及伤害他人等恶性事件。她向我们普及了一个重要的命题,她说心理健康的一些基本命题,我们与我们通常的一些教育命题是不同的,她还举了几个例子,让我们明白我们原来以为的健康并非心理学上的健康。比如如果</div> </li> <li><a href="/article/1835511163450912768.htm" title="2021年12月19日,春蕾教育集团团建活动感受——黄晓丹" target="_blank">2021年12月19日,春蕾教育集团团建活动感受——黄晓丹</a> <span class="text-muted">黄错错加油</span> <div>感受:1.从陌生到熟悉的过程。游戏环节让我们在轻松的氛围中得到了锻炼,也增长了不少知识。2.游戏过程中,我们贡献的是个人力量,展现的是团队的力量。它磨合的往往不止是工作的熟悉,更是观念上契合度的贴近。3.这和工作是一样的道理。在各自的岗位上,每个人摆正自己的位置、各司其职充分发挥才能,并团结一致劲往一处使,才能实现最大的成功。新知:1.团队精神需要不断地创新。过去,人们把创新看作是冒风险,现在人们</div> </li> <li><a href="/article/1835511036317364224.htm" title="Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断" target="_blank">Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断</a> <span class="text-muted">尐尐呅</span> <div>结核病是艾滋病合并其他疾病中导致患者死亡的主要原因。其中结核病由结核分枝杆菌(Mycobacteriumtuberculosis,Mtb)感染引起,获得性免疫缺陷综合症(艾滋病)由人免疫缺陷病毒(Humanimmunodeficiencyvirustype1,HIV-1)感染引起。国家感染性疾病临床医学研究中心/深圳市第三人民医院张国良团队携手深圳华大生命科学研究院吴靓团队,共同研究得出单细胞测序</div> </li> <li><a href="/article/1835511030260789248.htm" title="c++ 的iostream 和 c++的stdio的区别和联系" target="_blank">c++ 的iostream 和 c++的stdio的区别和联系</a> <span class="text-muted">黄卷青灯77</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/iostream/1.htm">iostream</a><a class="tag" taget="_blank" href="/search/stdio/1.htm">stdio</a> <div>在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in</div> </li> <li><a href="/article/1835510909070569472.htm" title="瑶池防线" target="_blank">瑶池防线</a> <span class="text-muted">谜影梦蝶</span> <div>冥华虽然逃过了影梦的军队,但他是一个忠臣,他选择上报战况。败给影梦后成逃兵,高层亡尔还活着,七重天失守......随便一条,即可处死冥华。冥华自然是知道以仙界高层的习性此信一发自己必死无疑,但他还选择上报实情,因为责任。同样此信送到仙宫后,知道此事的人,大多数人都认定冥华要完了,所以上到仙界高层,下到扫大街的,包括冥华自己,全都准备好迎接冥华之死。如果仙界现在还属于两方之争的话,冥华必死无疑。然而</div> </li> <li><a href="/article/1835510656011431936.htm" title="爬山后遗症" target="_blank">爬山后遗症</a> <span class="text-muted">璃绛</span> <div>爬山,攀登,一步一步走向制高点,是一种挑战。成功抵达是一种无法言语的快乐,在山顶吹吹风,看看风景,这是从未有过的体验。然而,爬山一时爽,下山腿打颤,颠簸的路,一路向下走,腿部力量不够,走起来抖到不行,停不下来了!第二天必定腿疼,浑身酸痛,坐立难安!</div> </li> <li><a href="/article/87.htm" title="面向对象面向过程" target="_blank">面向对象面向过程</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>面向对象:把要完成的一件事,通过对象间的协作实现。 面向过程:把要完成的一件事,通过循序依次调用各个模块实现。 我把大象装进冰箱这件事为例,用面向对象和面向过程实现,都是用java代码完成。 1、面向对象 package bigDemo.ObjectOriented; /** * 大象类 * * @Description * @author FuJian</div> </li> <li><a href="/article/214.htm" title="Java Hotspot: Remove the Permanent Generation" target="_blank">Java Hotspot: Remove the Permanent Generation</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a> <div>  openjdk上关于hotspot将移除永久带的描述非常详细,http://openjdk.java.net/jeps/122   JEP 122: Remove the Permanent Generation Author Jon Masamitsu Organization Oracle Created 2010/8/15 Updated 2011/</div> </li> <li><a href="/article/341.htm" title="正则表达式向前查找向后查找,环绕或零宽断言" target="_blank">正则表达式向前查找向后查找,环绕或零宽断言</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>向前查找和向后查找 1. 向前查找:根据要匹配的字符序列后面存在一个特定的字符序列(肯定式向前查找)或不存在一个特定的序列(否定式向前查找)来决定是否匹配。.NET将向前查找称之为零宽度向前查找断言。     对于向前查找,出现在指定项之后的字符序列不会被正则表达式引擎返回。 2. 向后查找:一个要匹配的字符序列前面有或者没有指定的</div> </li> <li><a href="/article/468.htm" title="BaseDao" target="_blank">BaseDao</a> <span class="text-muted">171815164</span> <a class="tag" taget="_blank" href="/search/seda/1.htm">seda</a> <div> import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.ResultSet; public class BaseDao { public Conn</div> </li> <li><a href="/article/595.htm" title="Ant标签详解--Java命令" target="_blank">Ant标签详解--Java命令</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/Java%E5%91%BD%E4%BB%A4/1.htm">Java命令</a> <div>        这一篇主要介绍与java相关标签的使用         终于开始重头戏了,Java部分是我们关注的重点也是项目中用处最多的部分。           1</div> </li> <li><a href="/article/722.htm" title="[简单]代码片段_电梯数字排列" target="_blank">[简单]代码片段_电梯数字排列</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a> <div>       今天看电梯数字排列是9 18 26这样呈倒N排列的,写了个类似的打印例子,如下:       import java.util.Arrays; public class 电梯数字排列_S3_Test { public static void main(S</div> </li> <li><a href="/article/849.htm" title="Hessian原理" target="_blank">Hessian原理</a> <span class="text-muted">云端月影</span> <a class="tag" taget="_blank" href="/search/hessian%E5%8E%9F%E7%90%86/1.htm">hessian原理</a> <div>Hessian 原理分析 一.      远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协</div> </li> <li><a href="/article/976.htm" title="区分Activity的四种加载模式----以及Intent的setFlags" target="_blank">区分Activity的四种加载模式----以及Intent的setFlags</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>  在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。 加载模式分类及在哪里配置 Activity有四种加载模式: standard singleTop</div> </li> <li><a href="/article/1103.htm" title="hibernate几个核心API及其查询分析" target="_blank">hibernate几个核心API及其查询分析</a> <span class="text-muted">antonyup_2006</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a> <div>(一)  org.hibernate.cfg.Configuration类         读取配置文件并创建唯一的SessionFactory对象.(一般,程序初始化hibernate时创建.)         Configuration co</div> </li> <li><a href="/article/1230.htm" title="PL/SQL的流程控制" target="_blank">PL/SQL的流程控制</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/PL%2FSQL%E7%BC%96%E7%A8%8B/1.htm">PL/SQL编程</a><a class="tag" taget="_blank" href="/search/%E5%BE%AA%E7%8E%AF%E6%8E%A7%E5%88%B6/1.htm">循环控制</a> <div>PL/SQL也是一门高级语言,所以流程控制是必须要有的,oracle数据库的pl/sql比sqlserver数据库要难,很多pl/sql中有的sqlserver里面没有   流程控制; 分支语句 if 条件 then 结果 else 结果 end if ; 条件语句 case when 条件 then 结果; 循环语句 loop </div> </li> <li><a href="/article/1357.htm" title="强大的Mockito测试框架" target="_blank">强大的Mockito测试框架</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>一.自动生成Mock类        在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。二.自动注入Mock类到被测试类  &nbs</div> </li> <li><a href="/article/1484.htm" title="精通Oracle10编程SQL(11)开发子程序" target="_blank">精通Oracle10编程SQL(11)开发子程序</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>/* *开发子程序 */ --子程序目是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用程序中多次调用 --PL/SQL有两种类型的子程序:过程和函数 --开发过程 --建立过程:不带任何参数 CREATE OR REPLACE PROCEDURE out_time IS BEGIN DBMS_OUTPUT.put_line(systimestamp); E</div> </li> <li><a href="/article/1611.htm" title="【EhCache一】EhCache版Hello World" target="_blank">【EhCache一】EhCache版Hello World</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a> <div>本篇是EhCache系列的第一篇,总体介绍使用EhCache缓存进行CRUD的API的基本使用,更细节的内容包括EhCache源代码和设计、实现原理在接下来的文章中进行介绍   环境准备 1.新建Maven项目   2.添加EhCache的Maven依赖 <dependency> <groupId>ne</div> </li> <li><a href="/article/1738.htm" title="学习EJB3基础知识笔记" target="_blank">学习EJB3基础知识笔记</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/jboss/1.htm">jboss</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a><a class="tag" taget="_blank" href="/search/ejb/1.htm">ejb</a> <div>最近项目进入系统测试阶段,全赖袁大虾领导有力,保持一周零bug记录,这也让自己腾出不少时间补充知识。花了两天时间把“传智播客EJB3.0”看完了,EJB基本的知识也有些了解,在这记录下EJB的部分知识,以供自己以后复习使用。   EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基</div> </li> <li><a href="/article/1865.htm" title="angular.bootstrap" target="_blank">angular.bootstrap</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a><a class="tag" taget="_blank" href="/search/angular%E4%B8%AD%E6%96%87api/1.htm">angular中文api</a> <div>angular.bootstrap 描述:     手动初始化angular。     这个函数会自动检测创建的module有没有被加载多次,如果有则会在浏览器的控制台打出警告日志,并且不会再次加载。这样可以避免在程序运行过程中许多奇怪的问题发生。   使用方法:     angular .</div> </li> <li><a href="/article/1992.htm" title="java-谷歌面试题-给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数" target="_blank">java-谷歌面试题-给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class SearchInShiftedArray { /** * 题目:给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数。 * 请在这个特殊数组中找出给定的整数。 * 解答: * 其实就是“旋转数组”。旋转数组的最小元素见http://bylijinnan.iteye.com/bl</div> </li> <li><a href="/article/2119.htm" title="天使还是魔鬼?都是我们制造" target="_blank">天使还是魔鬼?都是我们制造</a> <span class="text-muted">ducklsl</span> <a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a><a class="tag" taget="_blank" href="/search/%E6%83%85%E6%84%9F/1.htm">情感</a> <div>----------------------------剧透请原谅,有兴趣的朋友可以自己看看电影,互相讨论哦!!!     从厦门回来的动车上,无意中瞟到了书中推荐的几部关于儿童的电影。当然,这几部电影可能会另大家失望,并不是类似小鬼当家的电影,而是关于“坏小孩”的电影!     自己挑了两部先看了看,但是发现看完之后,心里久久不能平</div> </li> <li><a href="/article/2246.htm" title="[机器智能与生物]研究生物智能的问题" target="_blank">[机器智能与生物]研究生物智能的问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%94%9F%E7%89%A9/1.htm">生物</a> <div>       我想,人的神经网络和苍蝇的神经网络,并没有本质的区别...就是大规模拓扑系统和中小规模拓扑分析的区别....       但是,如果去研究活体人类的神经网络和脑系统,可能会受到一些法律和道德方面的限制,而且研究结果也不一定可靠,那么希望从事生物神经网络研究的朋友,不如把</div> </li> <li><a href="/article/2373.htm" title="获取Android Device的信息" target="_blank">获取Android Device的信息</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div> String phoneInfo = "PRODUCT: " + android.os.Build.PRODUCT; phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI; phoneInfo += ", TAGS: " + android.os.Build.TAGS; ph</div> </li> <li><a href="/article/2500.htm" title="最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现" target="_blank">最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D/1.htm">字符串匹配</a> <div>原文:http://www.javacodegeeks.com/2013/11/java-implementation-of-optimal-string-alignment.html------------------------------------------------------------------------------------------------------------</div> </li> <li><a href="/article/2627.htm" title="小学5年级英语单词背诵第一课" target="_blank">小学5年级英语单词背诵第一课</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/english/1.htm">english</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a> <div>long 长的 show 给...看,出示 mouth 口,嘴 write 写   use 用,使用 take 拿,带来 hand 手 clever 聪明的   often 经常 wash 洗 slow 慢的 house 房子   water 水 clean 清洁的 supper 晚餐 out 在外   face 脸,</div> </li> <li><a href="/article/2754.htm" title="macvim的使用实战" target="_blank">macvim的使用实战</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mac/1.htm">mac</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>macvim用的是mac里面的vim, 只不过是一个GUI的APP, 相当于一个壳   1. 下载macvim https://code.google.com/p/macvim/   2. 了解macvim :h               vim的使用帮助信息 :h macvim  </div> </li> <li><a href="/article/2881.htm" title="java二分法查找" target="_blank">java二分法查找</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/java%E4%BA%8C%E5%88%86%E6%B3%95%E6%9F%A5%E6%89%BE/1.htm">java二分法查找</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%88%86%E6%B3%95/1.htm">二分法</a><a class="tag" taget="_blank" href="/search/java%E4%BA%8C%E5%88%86%E6%B3%95/1.htm">java二分法</a> <div>java二分法查找 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年6月23日 11:40:03 星期二 http:/</div> </li> <li><a href="/article/3008.htm" title="Spring Cache注解+Memcached" target="_blank">Spring Cache注解+Memcached</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/memcached/1.htm">memcached</a> <div>Spring3.1 Cache注解  依赖jar包: <!-- simple-spring-memcached --> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>simple-s</div> </li> <li><a href="/article/3135.htm" title="apache commons io包快速入门" target="_blank">apache commons io包快速入门</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/apache+commons/1.htm">apache commons</a> <div>原文参考 http://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html   Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍:   1)  工具类   2</div> </li> <li><a href="/article/3262.htm" title="如何学习编程" target="_blank">如何学习编程</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>首先,我想说一下学习思想.学编程其实跟网络游戏有着类似的效果.开始的时候,你会对那些代码,函数等产生很大的兴趣,尤其是刚接触编程的人,刚学习第一种语言的人.可是,当你一步步深入的时候,你会发现你没有了以前那种斗志.就好象你在玩韩国泡菜网游似的,玩到一定程度,每天就是练级练级,完全是一个想冲到高级别的意志力在支持着你.而学编程就更难了,学了两个月后,总是觉得你好象全都学会了,却又什么都做不了,又没有</div> </li> <li><a href="/article/3389.htm" title="架构师之spring-----spring3.0新特性的bean加载控制@DependsOn和@Lazy" target="_blank">架构师之spring-----spring3.0新特性的bean加载控制@DependsOn和@Lazy</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a> <div>1.前言。    如题。 2.描述。    @DependsOn用于强制初始化其他Bean。可以修饰Bean类或方法,使用该Annotation时可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean。 @DependsOn({"steelAxe","abc"}) @Comp</div> </li> <li><a href="/article/3516.htm" title="Spring4+quartz2的配置和代码方式调度" target="_blank">Spring4+quartz2的配置和代码方式调度</a> <span class="text-muted">Everyday都不同</span> <a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81/1.htm">代码</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a><a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a><a class="tag" taget="_blank" href="/search/quartz2.x/1.htm">quartz2.x</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/1.htm">定时任务</a> <div>前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……   quartz定时任务必须搞清楚几个概念: JobDetail——处理类 Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象 Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发</div> </li> <li><a href="/article/3643.htm" title="Hibernate入门" target="_blank">Hibernate入门</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>  前言   使用面向对象的语言和关系型的数据库,开发起来很繁琐,费时。由于现在流行的数据库都不面向对象。Hibernate 是一个Java的ORM(Object/Relational Mapping)解决方案。   Hibernte不仅关心把Java对象对应到数据库的表中,而且提供了请求和检索的方法。简化了手工进行JDBC操作的流程。   如</div> </li> <li><a href="/article/3770.htm" title="Math类" target="_blank">Math类</a> <span class="text-muted">xiaoxing598</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a> <div>一、Java中的数字(Math)类是final类,不可继承。 1、常数 PI:double圆周率 E:double自然对数 2、截取(注意方法的返回类型) double ceil(double d) 返回不小于d的最小整数 double floor(double d) 返回不大于d的整最大数 int round(float f) 返回四舍五入后的整数 long round</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>