文强的个人空间
2016-11-05T23:43:38.911Z
http://wenqiang-china.github.io/
wenqiang
Hexo
别在等待中失去了节奏
http://wenqiang-china.github.io/2016/11/06/no-waiting/
2016-11-05T20:04:04.000Z
2016-11-05T23:43:38.911Z
<p>再一次于凌晨从被窝中冻醒,辗转反侧了许久,决定写一篇博文。作为探讨爱情观的博文,可以说这是所有我写过的非技术类博文中的一股清流。</p>
<h3 id="从节奏谈起"><a href="#从节奏谈起" class="headerlink" title="从节奏谈起"></a>从节奏谈起</h3><p>节奏作为开场最为合适不过,小学上音乐课老师就夸我打节拍特别准。确切的说,这种节奏感也可以说是从小学开始的。小学时连做作业都是按照老师说好的节奏来的,五一七天假,每天写一点作业然后去玩,遵从完美的规划。然而第七天的时候,母亲做完农活回来,见我还在不紧不慢的写作业,问我写完了没,我说还没有。于是她把我整个作业本都撕了。我流了会眼泪,然而赶紧苦逼地赶起了作业,终于写了一下午写完了。那是我第一次发现<strong>deadline之前的效率是最高的</strong>。于是从那之后我换了种节奏,每次放假都是先玩命把作业写完,然后随便玩。当然不都是纯为了完成作业而去做作业,例如初中的时候感觉做英语题是种享受,每次放假当晚我都会拿出所有的英语题试卷堆在桌上,然后奋战1个多小时,享受虐题的乐趣。8开的试卷,单面3分钟,正确率95%,这是当时我创造的记录。</p>
<p>这种节奏从小学到高中结束,一路感觉特别顺畅,可能是节奏路线和大主题契合的缘故。在这种节奏下,不用考虑<code>deadline</code>,因为很少会遇到。直到上了大学,这种境况被打破。</p>
<h3 id="deadline方式的崛起"><a href="#deadline方式的崛起" class="headerlink" title="deadline方式的崛起"></a>deadline方式的崛起</h3><p>没错,大学可以看作是<code>deadline</code>方式崛起的元年。大一的时候把很多精力放在高数上,以为可以凭借高数<code>制霸学院</code>,然而最终发现自己还是太<code>naive</code>,连自己宿舍的一个江苏的哥们都比不过。在两次高数期末考试都徘徊在90分边缘后,我决定转变思路,找寻一条可持续发展的新道路。于是在大二一年,考了英语4、6级,计算机2、4级,不过后来发现这些东西并没什么用。其实在这个时候已经有些跑偏了,不再像大一学高数那样花费很多经历在上面,而是在考试前的半个月内开始<code>突击模式</code>,这个时候终于看到<code>deadline</code>方式的高效。从此开始愈发喜欢上了这种方式,以至于后来很多地方都在用,包括研究生阶段的考前复习,找实习,甚至是学位论文的开题。很多时候做事是迫于<code>deadline</code>的压力,常常差一点点就超过<code>deadline</code>了,不过好在凭借运气<code>苟活</code>到现在。</p>
<p>实习之后发现<code>deadline</code>竟然在工作中广泛使用。每次接到需求都要预估一个<code>deadline</code>,然后为了按时交付有时就不免加班完成。</p>
<h3 id="deadline几宗罪"><a href="#deadline几宗罪" class="headerlink" title="deadline几宗罪"></a>deadline几宗罪</h3><p>然而<code>deadline</code>带来的负面效应太多,首先它打乱了<code>节奏</code>。我不得不将生活状态划分为<code>平常状态</code>和<code>deadline前夕状态</code>,然后在分界岭出来一个突变,踩一脚油门开始变速。这对于我这种单线程工作生活的人来说是种挑战,常常在各个<code>deadline</code>间疲于奔波,感受不到那种<code>从容</code>。其次它忽略了过程,没有了全程参与给予的享受体验。</p>
<p>具体到自己身上,因为有些deadline没有确定好,所以直接忽视掉。例如现在处于找工作的状态,然而校招快结束了还没有出手,主要原因是不清楚<code>deadline</code>是什么时候,总是觉得时间还有很多,过段时间再想也没事。哪怕是有人催,还是没有动力跑。<strong>总觉得青春一大把,却没有认识到青春是最不能辜负的</strong>。</p>
<h3 id="启发式"><a href="#启发式" class="headerlink" title="启发式"></a>启发式</h3><p>我在人工智能领域看到了上面问题的影子,说这句话不是想吹牛逼,而是想说我在AI的接触中体会到了同样深深的<code>无力感</code>。在AI中很多问题是存在精确解的,但是需要的时间或空间都是超乎想象的,由于耗不起,所以只能退而求其次。但是怎样以小的代价逼近精确解呢,这个很难说,其中有一种方案就是采用启发式的策略。大致就是说,我们在这个时刻是肯定不知道怎样才是<code>全局最优</code>的,但是我们可以使当前的<code>局部状态</code>保持最优的,然后结合实际不断调整,尽量使得全局最优。但是这样真的很靠谱吗,不一定,就像爬一座山,想要最快地到达山顶,于是找最陡峭的地方爬,因为这里是升的最快的,但是爬着爬着,越来越平缓,甚至最终就成了平路。于是站起身想要感叹<code>一览众山小</code>,结果发现自己爬的只是个小土坡,真正的高山在身旁矗立着。</p>
<p>尽管可以尽可能避免出现这种窘境,但是即便是引入随机,也要不断尝试,迭代,调优,要重复很多次才能找到比较理想的模型。然而,生活不是这样,<strong>生活中没有Retry按钮,所以只能一气呵成</strong>。</p>
<h3 id="正题"><a href="#正题" class="headerlink" title="正题"></a>正题</h3><p>前面说的貌似离题了,其实不然。身为一个学物理出身的,我始终坚信,<code>万物同理</code>。所以,再次展示下我的逻辑思辨过程。</p>
<h4 id="简要回顾"><a href="#简要回顾" class="headerlink" title="简要回顾"></a>简要回顾</h4><p>对于异性的好感是从幼儿园开始萌生的,当时觉得一个女孩蛮漂亮,然后过了段时间觉得自己之前的认识存在问题。过了段时间决定另外一个女孩蛮不错,再过段时间觉得很一般。如此反复几次,我对自己的审美观彻底失去信心。这种审美观的自卑使自己一直处于观望态度,因为怕选择出错,所以一直没有选择。这种<code>暗恋</code>的方式至少从表面看是无害的,所以这种方式一直使用了10多年,直到现在。</p>
<p>上了大学后总免不了被亲戚催着找对象,然而我都可以找到理由搪塞过去。身为一名理科生出身,最不缺的就是理由啦。其中一个理由不光糊弄了别人,也糊弄了自己,它的内容很简单,是这样的:“我觉得谈恋爱肯定要吃吃饭、出去玩一玩什么的,而这些是需要钱的。肯定不能用父母的钱来扯这些没用的事,所以要自己有经济来源。但是我哥哥告诫我不要因为去挣眼前的小钱而失去了挣日后大钱的机会,我觉得好有道理,所以我就不会因为这个去参加勤工助学、当家教了。既然这样就没有经济来源了,那就不用谈恋爱了。”这个理由很简短有力,我自己都信了。虽然后来自己参加过勤工助学、当过英语家教,然而挣的钱都当伙食费吃掉了,而且觉得很合理。</p>
<h4 id="吐槽部分"><a href="#吐槽部分" class="headerlink" title="吐槽部分"></a>吐槽部分</h4><ul>
<li>根据6度空间理论,任何两个人想要建立联系最多经过6个人就够了,后来还有人证实了好像只要5个人?这块记不太清了。总之<strong>想要进入到某个社交圈并不难</strong>。</li>
<li>人与人之间的情感总是建立在相处的基础上,也就是<code>日久生情</code>了。对于这种现象理解起来就比较多元化了,直观地感觉这不就是一句废话吗;心机一些的理解是想要和一个人产生感情, 只要适当地多接触,最终成为TA生活的一部分,就自然而然成功了。</li>
<li>未来是不确定的,这是美好也是残酷的地方。对于未来的期待可能是出于对现状的不满和不甘,也可能只是单纯的期待。但是这个期待最终会成什么样子,这个谁都说不准。具体到本文的主旨,未来会遇到什么人是充满未知的。我曾为《假如爱有天意》《我脑中的橡皮擦》这种刻骨铭心的爱而感动,虽然我更多在影视剧中看到;也曾为见到很多年近而立之年的高校老师急于结婚而参与到各种相亲交友活动而唏嘘,虽然这一幕在生活中常常看到。量子力学告诉我们想要预测到未来是不可能的,实际状态会在临近真相的那一秒瞬间<code>塌缩</code>。 </li>
</ul>
<p>综上,无论是相识相爱,或是谈婚论嫁,都是在自己的一个小圈子中做出选择的。这个圈子是动态变化,可以想象成钱钟书先生说的“围城”。自己究竟会选择哪一个相伴终生,取决于做出选择那一刻圈子里的人。无论是选择等待还是选择扩大圈子,无非都是想在一个适当的时机在合理的圈子中做出合理的选择。但是什么时候算合理呢,这个谁知道呢。可能在感觉心满意足的时候,可能在感觉身心俱疲的时候,可能在迫于身边压力的时候,放弃了等待,做出了选择,于是诸多不确定的东西瞬间确定了。此时的爱情就像<code>薛定谔的猫</code>,任何揣测都是徒劳的,打开盒子的一刹那,是生是死一目了然。</p>
<h4 id="思考"><a href="#思考" class="headerlink" title="思考"></a>思考</h4><p>但是知道了真相后会怎样呢?不知道,不瞎说了。</p>
<h4 id="爱情观"><a href="#爱情观" class="headerlink" title="爱情观"></a>爱情观</h4><p>爱情观,择偶观,在我看来基本等同。还是那句话,<strong>万事万物皆同理</strong>。</p>
<ul>
<li>首先我给自己设定了<code>deadline</code>,不管是出于对自己、家人的负责,还是作为一个缓兵之计,<code>deadline</code>都是不可或缺的。我将28岁作为结婚的<code>deadline</code>,那么向前倒推2、3年,就是恋爱开始的时间。<br>除非自己在28岁左右事业、生活中有很大波动,否则这个<code>deadline</code>还是很靠谱、很稳定的。</li>
<li>其次我在找寻的过程中使用启发式的原则,在<code>best case</code> 和 <code>worst case</code> 之间做出决策。决策依据是和自己的<code>契合</code>程度,这个没办法量化,只可意会。</li>
</ul>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>无论是爱情、生活,等待都是整个环节中的一部分。但是无论选择怎样的出行方式,最要紧的是<code>尽快上路</code>,别磨蹭。节奏路上找,风景路上看,至于何时遇到何人何时,看自己,也看别人。一切随缘又非缘。</p>
<p>写到这里,我决定把工作找了先。</p>
<p>再一次于凌晨从被窝中冻醒,辗转反侧&
hexo deploy时提示权限不够的问题
http://wenqiang-china.github.io/2016/05/29/hexo-deploy-problem/
2016-05-29T03:07:07.310Z
2016-05-29T03:18:26.456Z
<p>以前按照网上的教程生成过ssh的key,并且上传到了coding.net的网站上,原以为这样就一劳永逸了,但是每次重新打开git shell 部署博客时总是提示permission denied。下面是解决办法。</p>
<p><strong>注意</strong>:前提是已经使用ssh-keygen生成过key,如果没有,可以采用类似下面的代码生成<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C "wenqiang_china@126.com"</span><br></pre></td></tr></table></figure></p>
<p>生成的key会在.ssh文件夹中。<br>生成完以后要将.ssh文件夹中的id_rsa.pub文件复制后提交到github.com上,然后输入以下代码验证是否提交成功。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure></p>
<p>上述过程不详细说了,网上教程很多。</p>
<h3 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h3><p>当下次执行hexo d时提示如下错误信息<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Permission denied (publickey).</span><br><span class="line">fatal: Could not read from remote repository.</span><br><span class="line"></span><br><span class="line">Please make sure you have the correct access rights</span><br><span class="line">and the repository exists.</span><br></pre></td></tr></table></figure></p>
<p>此时执行以下代码添加key<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -add ~/.ssh/id_rsa</span><br></pre></td></tr></table></figure></p>
<p>之后执行hexo d就可以成功部署了。</p>
<p>以前按照网上的教程生成过ssh的key,并且&#x
Python flask使用经验教训总结
http://wenqiang-china.github.io/2016/05/29/python-flask-experience/
2016-05-29T02:17:10.988Z
2016-05-30T14:08:03.446Z
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>这段时间开始接触flask,中间遇到些问题,也走过写弯路,本片博客用来说明下自己这段时间内踩的坑。</p>
<h3 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h3><h4 id="问题一:在使用SQLAlchemy管理MySQL数据库时,创建db实例时报错,提示Import-MySQLdb出错"><a href="#问题一:在使用SQLAlchemy管理MySQL数据库时,创建db实例时报错,提示Import-MySQLdb出错" class="headerlink" title="问题一:在使用SQLAlchemy管理MySQL数据库时,创建db实例时报错,提示Import MySQLdb出错"></a>问题一:在使用SQLAlchemy管理MySQL数据库时,创建db实例时报错,提示Import MySQLdb出错</h4><p>要说明的是,在使用SQLAlchemy时,要先安装好MySQL数据库和MySQLdb,因为SQLAlchemy会调用MySQLdb模块。Windows下安装MySQLdb模块可以看一看<a href="http://blog.csdn.net/wklken/article/details/7253245" target="_blank" rel="external">这篇博客</a>,如果是linux下安装则可以参考我的<a href="../../../04/28/mysqldb-install/">这篇博客</a>。</p>
<h4 id="问题二:同样在使用SQLAlchemy时,执行db-create-all-创建数据表时提示OperationalError-mysql-exceptions-OperationalError-1045-“Access-denied-for-user-‘ODBC’-’localhost’-using-password-NO-”"><a href="#问题二:同样在使用SQLAlchemy时,执行db-create-all-创建数据表时提示OperationalError-mysql-exceptions-OperationalError-1045-“Access-denied-for-user-‘ODBC’-’localhost’-using-password-NO-”" class="headerlink" title="问题二:同样在使用SQLAlchemy时,执行db.create_all()创建数据表时提示OperationalError: (_mysql_exceptions.OperationalError) (1045, “Access denied for user ‘ODBC’@’localhost’ (using password: NO)”)"></a>问题二:同样在使用SQLAlchemy时,执行db.create_all()创建数据表时提示OperationalError: (_mysql_exceptions.OperationalError) (1045, “Access denied for user ‘ODBC’@’localhost’ (using password: NO)”)</h4><p>分析,权限不够,没有在数据库中给所操作的数据库授权。<br>可以采用类似下面的方式,例如数据库名为test,则授权语句为<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grant select ,insert,update,delete,lock tables on test.* to username@localhost identified by 'password';</span><br></pre></td></tr></table></figure></p>
<p>上面的username处填写自己的用户名,password处填写自己连接时的密码。</p>
<h4 id="问题三:使用SQLAlchemy时,执行db-create-all-时出错,提示:OperationalError-mysql-exceptions-OperationalError-1049-“Unknown-database-‘flasky’”"><a href="#问题三:使用SQLAlchemy时,执行db-create-all-时出错,提示:OperationalError-mysql-exceptions-OperationalError-1049-“Unknown-database-‘flasky’”" class="headerlink" title="问题三:使用SQLAlchemy时,执行db.create_all()时出错,提示:OperationalError: (_mysql_exceptions.OperationalError) (1049, “Unknown database ‘flasky’”)"></a>问题三:使用SQLAlchemy时,执行db.create_all()时出错,提示:OperationalError: (_mysql_exceptions.OperationalError) (1049, “Unknown database ‘flasky’”)</h4><p>分析:错误提示未知数据库”flasky”,因为在MySQL数据库中这个名为flasky的数据库根本不存在。注意,进行创建表操作前,必须保证首先所需的数据库已经在MySQL中创建好。这个数据库的名字在创建flask应用时设置<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">app.config[<span class="string">'SQLALCHEMY_DATABASE_URI'</span>]=<span class="string">'mysql://root:root@localhost/flasky'</span></span><br></pre></td></tr></table></figure></p>
<p>上面最后的flasky就是所用的数据库的名字,这个要在MySQL数据库中建好。<br>所以,<strong>合理的顺序是:首先在MySQL中创建好flasky数据库,然后授权,再之后在flask应用中定义类型,并创建数据表</strong><br>上述过程类似如下操作:</p>
<ul>
<li><p>首先在数据库中定义数据库并授权</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">create database flasky;</span><br><span class="line">grant select,insert,update,delete,lock tables on flasky.* to username@localhost identified by 'password';</span><br></pre></td></tr></table></figure>
</li>
<li><p>接下来在flask代码中定义ORM,创建SQLAlchemy实例并在必要的时候使用</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> flask.ext.sqlalchemy <span class="keyword">import</span> SQLAlchemy</span><br><span class="line"></span><br><span class="line">app=Flask(__name__)</span><br><span class="line">app.config[<span class="string">'SQLALCHEMY_DATABASE_URI'</span>]=<span class="string">'mysql://username:password@localhost/flasky'</span> <span class="comment">#使用MySQLdb数据库</span></span><br><span class="line">app.config[<span class="string">'SQLALCHEMY_COMMIT_ON_TEARDOWN'</span>]=<span class="keyword">True</span> <span class="comment">#设置为自动提交</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#下面定义两个数据表</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Role</span><span class="params">(db.Model)</span>:</span></span><br><span class="line"> __tablename__=<span class="string">'roles'</span></span><br><span class="line"> id=db.Column(db.Integer,primary_key=<span class="keyword">True</span>)</span><br><span class="line"> name=db.Column(db.String(<span class="number">64</span>),unique=<span class="keyword">True</span>)</span><br><span class="line"> users=db.relationship(<span class="string">"User"</span>,backref=<span class="string">"role"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__repr__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">'<Role %r>'</span>%self.name</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">User</span><span class="params">(db.Model)</span>:</span></span><br><span class="line"> __tablename__=<span class="string">"users"</span></span><br><span class="line"> id=db.Column(db.Integer,primary_key=<span class="keyword">True</span>)</span><br><span class="line"> username=db.Column(db.String(<span class="number">64</span>),unique=<span class="keyword">True</span>,index=<span class="keyword">True</span>)</span><br><span class="line"> role_id=db.Column(db.Integer,db.ForeignKey(<span class="string">'roles.id'</span>))</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__repr__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">'<User %r>'</span>%self.username</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>然后可以在python shell下执行db.create_all()方法在数据库中创建两个数据表。</p>
<h4 id="问题四:在使用模板引擎时正文采用中文会出现utf8-decode-error的错误出现"><a href="#问题四:在使用模板引擎时正文采用中文会出现utf8-decode-error的错误出现" class="headerlink" title="问题四:在使用模板引擎时正文采用中文会出现utf8 decode error的错误出现"></a>问题四:在使用模板引擎时正文采用中文会出现utf8 decode error的错误出现</h4><p>原因是模板文件的编码不对,最好采用utf8无BOM的格式。在notepad++ 中默认编码是ANSI,需要改过来。</p>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>这ڻ
浅说Python 中的函数式编程
http://wenqiang-china.github.io/2016/05/20/python-functional-programming/
2016-05-20T00:16:31.950Z
2016-05-20T02:09:07.985Z
<h4 id="函数式编程"><a href="#函数式编程" class="headerlink" title="函数式编程"></a>函数式编程</h4><p>函数式编程思想有着50多年的历史,最古老的算是Lisp语言了。如今众多语言都在一定程度上支持函数式编程,如Python、Ruby、Javascript,而其他一些语言如Java、PHP都增加了对于匿名函数的支持,可以看到函数编程的思想还很受欢迎。<br>下面一段话引自知乎,<a href="https://www.zhihu.com/topic/19585411/top-answers" target="_blank" rel="external">原文地址</a></p>
<blockquote>
<p>函数式编程是一种编程范式,常见的编程范式有命令式编程,函数式编程,逻辑式编程,值得一提的是面向对象编程也是一种命令式编程。命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取及存储指令),表达式(内存引用和算术运算)和控制语句(跳转指令),总之,命令式程序就是一个冯诺依曼机的指令序列。而函数式编程是面向数学的抽象,将计算描述为一种表达式求值,一句话,函数式程序就是一个表达式。<br>函数式编程中的函数并不是指计算机中的函数,而是指数学中的函数,即自变量的映射,即一个函数的值仅决定于函数参数的值,不依赖其他状态。在函数式语言中,函数作为一等公民,可以在任何地方定义,可以作为函数的参数和返回值,可以对函数进行组合。纯函数式编程语言中的变量也不是命令式编程中的变量,即存储状态的单元,而是代数中的变量,即一个值的名称。变量的值是不可变的,即不允许像命令式编程语言中的那样多次给一个变量赋值。严格意义上的函数式编程意味着不使用可变的变量,赋值,循环和其他命令式控制结构进行编程。</p>
</blockquote>
<p>函数式编程的好处<br>引用透明、没有副作用,用知乎上答主的说法就是</p>
<blockquote>
<p>一个好处是,函数既不依赖外部的状态也不修改外部的状态,这使得单元测试和调试更加容易。另一个好处是由于多个线程间不共享状态,因而可以避免发生死锁,可以很好地实现并发。<br>除此以外,函数式语言还具有以下特性:</p>
<ul>
<li>高阶函数(Higher-order function)</li>
<li>偏应用函数(Partially Applied Functions)</li>
<li>柯里化(Currying)</li>
<li>闭包(Closure)</li>
</ul>
</blockquote>
<h4 id="Python-中的函数式编程"><a href="#Python-中的函数式编程" class="headerlink" title="Python 中的函数式编程"></a>Python 中的函数式编程</h4><p>Python中对函数式编程语言的支持主要集中在提供了map(),reduce(),filter()三个函数和lambda算子,让人吃惊的是仅凭这几个函数就几乎可以实现任意的Python程序。<br>关于这几个函数的使用,参见我的另外一篇<a href="../../02/python-functions/">博客</a>,上面有对这几个函数的介绍。</p>
<p>下面的内容参考自<a href="http://python.jobbole.com/84927/" target="_blank" rel="external">这个网址</a><br><em>替换条件控制语句</em><br>对于下面的条件控制语句<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> condition1:</span><br><span class="line"> func1()</span><br><span class="line"><span class="keyword">elif</span> contidion2:</span><br><span class="line"> func2()</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> func3()</span><br></pre></td></tr></table></figure></p>
<p>的结构,替换成下面的表达式<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(condition1 <span class="keyword">and</span> func1()) <span class="keyword">or</span> (condition2 <span class="keyword">and</span> func2()) <span class="keyword">or</span> (func3())</span><br></pre></td></tr></table></figure></p>
<p>下面是一个例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>pr=<span class="keyword">lambda</span> p:p</span><br><span class="line"><span class="meta">>>> </span>print_number=<span class="keyword">lambda</span> x:(x==<span class="number">1</span> <span class="keyword">and</span> pr(<span class="string">"it's one"</span>)) <span class="keyword">or</span> (x==<span class="number">2</span> <span class="keyword">and</span> pr(<span class="string">"it's two"</span>)) <span class="keyword">or</span> (pr(<span class="string">"it's something else"</span>))</span><br><span class="line"><span class="meta">>>> </span>print_number(<span class="number">1</span>)</span><br><span class="line"><span class="string">"it's one"</span></span><br><span class="line"><span class="meta">>>> </span>print_number(<span class="number">2</span>)</span><br><span class="line"><span class="string">"it's two"</span></span><br><span class="line"><span class="meta">>>> </span>print_number(<span class="number">3</span>)</span><br><span class="line"><span class="string">"it's something else"</span></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>可以看到采用这种方式可以实现条件控制的替换。</p>
<p><em>替换循环控制语句</em></p>
<ul>
<li><p>替换for循环<br>由于和map函数使用相同,所以可以直接用map函数来实现for循环,看下面的例子</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic=<span class="keyword">lambda</span> x: x**<span class="number">3</span></span><br><span class="line">>>></span><br><span class="line">>>></span><br><span class="line"><span class="meta">>>> </span><span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">5</span>):</span><br><span class="line"><span class="meta">... </span> cubic(x)</span><br><span class="line">...</span><br><span class="line"><span class="number">0</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">8</span></span><br><span class="line"><span class="number">27</span></span><br><span class="line"><span class="number">64</span></span><br><span class="line"><span class="meta">>>> </span>map(cubic,range(<span class="number">5</span>))</span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">8</span>, <span class="number">27</span>, <span class="number">64</span>]</span><br><span class="line">>>></span><br></pre></td></tr></table></figure>
</li>
<li><p>替换while循环<br>相较而言,替换while循环稍稍麻烦一些,看下面的例子</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># statement-based while loop</span></span><br><span class="line"><span class="keyword">while</span> <condition>:</span><br><span class="line"> <pre-suite></span><br><span class="line"> <span class="keyword">if</span> <break_condition>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <suite></span><br><span class="line"> </span><br><span class="line"><span class="comment"># Equivalent FP-style recursive while loop</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">while_block</span><span class="params">()</span>:</span></span><br><span class="line"> <pre-suite></span><br><span class="line"> <span class="keyword">if</span> <break_condition>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <suite></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> </span><br><span class="line">while_FP = <span class="keyword">lambda</span>: <condition> <span class="keyword">and</span> (while_block() <span class="keyword">or</span> while_FP())</span><br><span class="line">while_FP()</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>函数式while_FP循环采用了递归的概念。当为true时,进入循环体,执行while_block();若为true时,返回1,while_FP()调用结束;若为false时,返回0,会继续执行or右侧的while_FP(),从而实现递归调用;若始终为false,则会持续递归调用while_FP(),这就实现了while语句中同样的功能。</p>
<p>看一个例子,下面的代码实现输入回显的echo功能,对比一下命令式编程和函数式编程。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#命令式编程版本</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">echo_IMP</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">while</span> <span class="number">1</span>:</span><br><span class="line"> x = raw_input(<span class="string">"IMP -- "</span>)</span><br><span class="line"> <span class="keyword">print</span> x</span><br><span class="line"> <span class="keyword">if</span> x == <span class="string">'quit'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> </span><br><span class="line">echo_IMP()</span><br></pre></td></tr></table></figure></p>
<p>下面是函数式编程版本<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">monadic_print</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> x</span><br><span class="line"> <span class="keyword">return</span> x</span><br><span class="line"> </span><br><span class="line">echo_FP = <span class="keyword">lambda</span>: monadic_print(raw_input(<span class="string">"FP -- "</span>))==<span class="string">'quit'</span> <span class="keyword">or</span> echo_FP()</span><br><span class="line">echo_FP()</span><br></pre></td></tr></table></figure></p>
<p>再来看个例子,该例子实现找出笛卡尔积元组集合中元素之积大于25的所有元组。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">bigmuls = <span class="keyword">lambda</span> xs,ys: filter(<span class="keyword">lambda</span> (x,y):x*y > <span class="number">25</span>, combine(xs,ys))</span><br><span class="line">combine = <span class="keyword">lambda</span> xs,ys: map(<span class="keyword">None</span>, xs*len(ys), dupelms(ys,len(xs)))</span><br><span class="line">dupelms = <span class="keyword">lambda</span> lst,n: reduce(<span class="keyword">lambda</span> s,t:s+t, map(<span class="keyword">lambda</span> l,n=n: [l]*n, lst))</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> bigmuls([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>],[<span class="number">10</span>,<span class="number">15</span>,<span class="number">3</span>,<span class="number">22</span>])</span><br><span class="line"></span><br><span class="line">[(<span class="number">3</span>, <span class="number">10</span>), (<span class="number">4</span>, <span class="number">10</span>), (<span class="number">2</span>, <span class="number">15</span>), (<span class="number">3</span>, <span class="number">15</span>), (<span class="number">4</span>, <span class="number">15</span>), (<span class="number">2</span>, <span class="number">22</span>), (<span class="number">3</span>, <span class="number">22</span>), (<span class="number">4</span>, <span class="number">22</span>)]</span><br></pre></td></tr></table></figure></p>
<h4 id="函数式编程"><a href="#函数式编程" class="headerlink" title="函
Python 中的属性函数
http://wenqiang-china.github.io/2016/05/20/python-property-function/
2016-05-19T16:28:18.763Z
2016-05-20T03:41:43.874Z
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>Python中的属性函数可以实现一些有用的功能,例如将类方法转换为只读属性、重新实现一个属性的setter和getter方法。下面进入正题。</p>
<h4 id="将类方法转为只读属性"><a href="#将类方法转为只读属性" class="headerlink" title="将类方法转为只读属性"></a>将类方法转为只读属性</h4><p>下面的例子参考<a href="http://python.jobbole.com/80955/" target="_blank" rel="external">这篇文章</a><br>对于下面的一个类<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Person</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="string">""""""</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">#----------------------------------------------------------------------</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, first_name, last_name)</span>:</span></span><br><span class="line"> <span class="string">"""Constructor"""</span></span><br><span class="line"> self.first_name = first_name</span><br><span class="line"> self.last_name = last_name</span><br><span class="line"> </span><br><span class="line"> <span class="comment">#----------------------------------------------------------------------</span></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">full_name</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> Return the full name</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"%s %s"</span> % (self.first_name, self.last_name)</span><br></pre></td></tr></table></figure></p>
<p>通过将full_name设置为只读属性,外接可以像调用普通的属性一样使用full_name,例如下面这样<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">>>> person = Person("Mike", "Driscoll")</span><br><span class="line">>>> person.full_name</span><br><span class="line">'Mike Driscoll'</span><br><span class="line">>>> person.first_name</span><br><span class="line">'Mike'</span><br><span class="line">>>> person.full_name = "Jackalope"</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File "<string>", line 1, in <fragment></span><br><span class="line">AttributeError: can't set attribute</span><br></pre></td></tr></table></figure></p>
<p>可以正常地访问它,但是无法设置属性,因为没有相应的setter方法,想要改变,只能通过修改first_name属性或者last_name属性的值来实现。下面看另外一个property的用处,即取代getter和setter方法。</p>
<h4 id="实现属性的getter和setter方法"><a href="#实现属性的getter和setter方法" class="headerlink" title="实现属性的getter和setter方法"></a>实现属性的getter和setter方法</h4><p>熟悉Java编程的人肯定对getter和setter并不陌生,对于类中的每一个属性,对外要提供getter和setter方法,如果用这种方式写Python代码,显得优点不专业,不光代码冗长,而且影响美观。采用property的方式可以改善这一问题。下面先看第一个版本的property改写示例。<br>假设现在有一个类Fees,它有一个属性_fee,如果模仿其他语言的方式提供getter和setter方法的话就是这样的。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> decimal <span class="keyword">import</span> Decimal</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Fees</span><span class="params">(object)</span>:</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""Constructor"""</span></span><br><span class="line"> self._fee = <span class="keyword">None</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_fee</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> The getter</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">return</span> self._fee</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">set_fee</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> The setter </span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">if</span> isinstance(value, str):</span><br><span class="line"> self._fee = Decimal(value)</span><br><span class="line"> <span class="keyword">elif</span> isinstance(value, Decimal):</span><br><span class="line"> self._fee = value</span><br><span class="line"> </span><br><span class="line"><span class="comment">#----------------------------------------------------------------------</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> f = Fees()</span><br><span class="line"> f.set_fee(<span class="string">"100"</span>)</span><br><span class="line"> f.get_fee()</span><br></pre></td></tr></table></figure></p>
<p>这样表面看起来挺不错的。上面本意是检查输入数据是不是数值类型或者是可以转换为数值的字符串,如果是则允许,否则不允许设置。但是如果用直接访问属性的方式来设定属性的值,那么对_fee的验证就不起作用了。看下面的使用过程<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>f.set_fee(<span class="string">"200"</span>)</span><br><span class="line"><span class="meta">>>> </span>f.get_fee()</span><br><span class="line">Decimal(<span class="string">'200'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#看起来还不错</span></span><br><span class="line"><span class="meta">>>> </span>f.set_fee(<span class="string">"haha"</span>)</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">1</span>, <span class="keyword">in</span> <module></span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">24</span>, <span class="keyword">in</span> set_fee</span><br><span class="line"> File <span class="string">"C:\Users\wenqiang\Anaconda\lib\decimal.py"</span>, line <span class="number">547</span>, <span class="keyword">in</span> __new__</span><br><span class="line"> <span class="string">"Invalid literal for Decimal: %r"</span> % value)</span><br><span class="line"> File <span class="string">"C:\Users\wenqiang\Anaconda\lib\decimal.py"</span>, line <span class="number">3873</span>, <span class="keyword">in</span> _raise_error</span><br><span class="line"> <span class="keyword">raise</span> error(explanation)</span><br><span class="line">decimal.InvalidOperation: Invalid literal <span class="keyword">for</span> Decimal: <span class="string">'haha'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#但是下面这样就不行了</span></span><br><span class="line"><span class="meta">>>> </span>f._fee=<span class="string">"haha"</span></span><br><span class="line"><span class="meta">>>> </span>f.get_fee()</span><br><span class="line"><span class="string">'haha'</span></span><br></pre></td></tr></table></figure></p>
<p>下面通过property来实现getter和setter的功能。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> decimal <span class="keyword">import</span> Decimal</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Fees</span><span class="params">(object)</span>:</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""Constructor"""</span></span><br><span class="line"> self._fee = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">fee</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> The fee property - the getter</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">return</span> self._fee</span><br><span class="line"></span><br><span class="line"><span class="meta"> @fee.setter</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">fee</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> The setter of the fee property</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">if</span> isinstance(value, str):</span><br><span class="line"> self._fee = Decimal(value)</span><br><span class="line"> <span class="keyword">elif</span> isinstance(value, Decimal):</span><br><span class="line"> self._fee = value</span><br><span class="line"></span><br><span class="line"><span class="comment">#----------------------------------------------------------------------</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> f = Fees()</span><br></pre></td></tr></table></figure></p>
<p>这回看一下使用起来如何<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>f=Fees()</span><br><span class="line"><span class="meta">>>> </span>f.fee=<span class="string">"1"</span></span><br><span class="line"><span class="meta">>>> </span>f.fee</span><br><span class="line">Decimal(<span class="string">'1'</span>)</span><br><span class="line"><span class="meta">>>> </span>f.fee=<span class="string">"haha"</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">1</span>, <span class="keyword">in</span> <module></span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">11</span>, <span class="keyword">in</span> fee</span><br><span class="line"> File <span class="string">"C:\Users\wenqiang\Anaconda\lib\decimal.py"</span>, line <span class="number">547</span>, <span class="keyword">in</span> __new__</span><br><span class="line"> <span class="string">"Invalid literal for Decimal: %r"</span> % value)</span><br><span class="line"> File <span class="string">"C:\Users\wenqiang\Anaconda\lib\decimal.py"</span>, line <span class="number">3873</span>, <span class="keyword">in</span> _raise_error</span><br><span class="line"> <span class="keyword">raise</span> error(explanation)</span><br><span class="line">decimal.InvalidOperation: Invalid literal <span class="keyword">for</span> Decimal: <span class="string">'haha'</span></span><br><span class="line"><span class="comment">#哈哈,还是被异常修改了</span></span><br><span class="line"><span class="meta">>>> </span>f._fee=<span class="string">"haha"</span></span><br><span class="line"><span class="meta">>>> </span>f.fee</span><br><span class="line"><span class="string">'haha'</span></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>通过以上对比,发现这种使用方式相对于getter和setter来说并没有多大改进,别急,看一下版本2中的改进。<br>版本二,专门定义一个类,将这个类应用到多个属性上。下面举个例子说明一下,例子来自于<a href="http://www.geekfan.net/7862/" target="_blank" rel="external">这篇文章</a></p>
<p>看一下这个例子使用第一个版本的效果<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Movie</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, title, rating, runtime, budget, gross)</span>:</span></span><br><span class="line"> self._rating = <span class="keyword">None</span></span><br><span class="line"> self._runtime = <span class="keyword">None</span></span><br><span class="line"> self._budget = <span class="keyword">None</span></span><br><span class="line"> self._gross = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"> self.title = title</span><br><span class="line"> self.rating = rating</span><br><span class="line"> self.runtime = runtime</span><br><span class="line"> self.gross = gross</span><br><span class="line"> self.budget = budget</span><br><span class="line"></span><br><span class="line"> <span class="comment">#nice</span></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">budget</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self._budget</span><br><span class="line"></span><br><span class="line"><span class="meta"> @budget.setter</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">budget</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Negative value not allowed: %s"</span> % value)</span><br><span class="line"> self._budget = value</span><br><span class="line"></span><br><span class="line"> <span class="comment">#ok </span></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">rating</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self._rating</span><br><span class="line"></span><br><span class="line"><span class="meta"> @rating.setter</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">rating</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Negative value not allowed: %s"</span> % value)</span><br><span class="line"> self._rating = value</span><br><span class="line"></span><br><span class="line"> <span class="comment">#uhh...</span></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">runtime</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self._runtime</span><br><span class="line"></span><br><span class="line"><span class="meta"> @runtime.setter</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">runtime</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Negative value not allowed: %s"</span> % value)</span><br><span class="line"> self._runtime = value </span><br><span class="line"></span><br><span class="line"> <span class="comment">#is this forever?</span></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">gross</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self._gross</span><br><span class="line"></span><br><span class="line"><span class="meta"> @gross.setter</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">gross</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Negative value not allowed: %s"</span> % value)</span><br><span class="line"> self._gross = value </span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">profit</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.gross - self.budget</span><br></pre></td></tr></table></figure></p>
<p>可以看到,对于多个属性这样设置仍然很麻烦,下面看一下版本2的写法<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> weakref <span class="keyword">import</span> WeakKeyDictionary</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NonNegative</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="string">"""A descriptor that forbids negative values"""</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, default)</span>:</span></span><br><span class="line"> self.default = default</span><br><span class="line"> self.data = WeakKeyDictionary()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__get__</span><span class="params">(self, instance, owner)</span>:</span></span><br><span class="line"> <span class="comment"># we get here when someone calls x.d, and d is a NonNegative instance</span></span><br><span class="line"> <span class="comment"># instance = x</span></span><br><span class="line"> <span class="comment"># owner = type(x)</span></span><br><span class="line"> <span class="keyword">return</span> self.data.get(instance, self.default)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__set__</span><span class="params">(self, instance, value)</span>:</span></span><br><span class="line"> <span class="comment"># we get here when someone calls x.d = val, and d is a NonNegative instance</span></span><br><span class="line"> <span class="comment"># instance = x</span></span><br><span class="line"> <span class="comment"># value = val</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Negative value not allowed: %s"</span> % value)</span><br><span class="line"> self.data[instance] = value</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Movie</span><span class="params">(object)</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#always put descriptors at the class-level</span></span><br><span class="line"> rating = NonNegative(<span class="number">0</span>)</span><br><span class="line"> runtime = NonNegative(<span class="number">0</span>)</span><br><span class="line"> budget = NonNegative(<span class="number">0</span>)</span><br><span class="line"> gross = NonNegative(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, title, rating, runtime, budget, gross)</span>:</span></span><br><span class="line"> self.title = title</span><br><span class="line"> self.rating = rating</span><br><span class="line"> self.runtime = runtime</span><br><span class="line"> self.budget = budget</span><br><span class="line"> self.gross = gross</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">profit</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.gross - self.budget</span><br></pre></td></tr></table></figure></p>
<p>这里结合了访问描述符,当解释器遇到对属性的访问时,如果是输出,就会将该属性看作一个带有<strong>get</strong>方法的描述符;如果是赋值操作,Python就会识别出该属性是一个带有<strong>set</strong>方法的描述符,从而执行Nonnegative类中的<strong>set</strong>方法。关于描述符的更多介绍,推荐看一下<a href="http://www.geekfan.net/7862/" target="_blank" rel="external">这篇文章</a>。<br>下面我们通过这种方式再来试试可不可以随意修改属性<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>m = Movie(<span class="string">'Casablanca'</span>, <span class="number">97</span>, <span class="number">102</span>, <span class="number">964000</span>, <span class="number">1300000</span>)</span><br><span class="line"><span class="meta">>>> </span><span class="keyword">print</span> m.budget <span class="comment"># calls Movie.budget.__get__(m, Movie)</span></span><br><span class="line"><span class="number">964000</span></span><br><span class="line"><span class="meta">>>> </span>m.budget=<span class="number">300</span></span><br><span class="line"><span class="meta">>>> </span>m.budget</span><br><span class="line"><span class="number">300</span></span><br><span class="line"><span class="meta">>>> </span>m.budget=<span class="number">-24</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">1</span>, <span class="keyword">in</span> <module></span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">16</span>, <span class="keyword">in</span> __set__</span><br><span class="line">ValueError: Negative value <span class="keyword">not</span> allowed: <span class="number">-24</span></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>这里面在Nonegative类中对数值是否为负做了限定,通过直接访问属性的方法无法再修改属性的值了,原理上面说过了。不过对于多个属性执行不同逻辑的getter和setter功能时,一个访问描述符就不足以解决问题了,就要引入多个,所以要看问题的具体情况合理使用。</p>
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>Python中
Python 中@classmethod和@staticmethod的区别
http://wenqiang-china.github.io/2016/05/19/python-diffrence-between-staticmethod-and-classmethod/
2016-05-19T14:46:52.620Z
2016-05-20T06:36:19.187Z
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>这是stackoverflow上面的一个问题,原文地址<a href="https://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python?rq=1" target="_blank" rel="external">What is the difference between @staticmethod and @classmethod in Python?</a>,现将其翻译为中文,放在下面,仅供参考。</p>
<h4 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h4><p><strong>问题</strong>:函数用@classmethod装饰和用@staticmethod装饰有什么区别?<br><strong>回答</strong>:<br><em>回答一:unutbu</em>:先举一个例子,看下面的代码,注意foo,class_foo,static_foo调用时的特征。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">A</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">foo</span><span class="params">(self,x)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> <span class="string">"executing foo(%s,%s)"</span>%(self,x)</span><br><span class="line"></span><br><span class="line"><span class="meta"> @classmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">class_foo</span><span class="params">(cls,x)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> <span class="string">"executing class_foo(%s,%s)"</span>%(cls,x)</span><br><span class="line"></span><br><span class="line"><span class="meta"> @staticmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">static_foo</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> <span class="string">"executing static_foo(%s)"</span>%x </span><br><span class="line"></span><br><span class="line">a=A()</span><br></pre></td></tr></table></figure></p>
<p>下面是一个对象调用方法的常用方式,对象实例a作为第一个参数被隐式地传递过去。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a.foo(<span class="number">1</span>)</span><br><span class="line"><span class="comment"># executing foo(<__main__.A object at 0xb7dbef0c>,1)</span></span><br></pre></td></tr></table></figure></p>
<p>如果使用@classmethod,类对象实例的类型作为第一个参数被隐式地传递进来而非通过self的方式。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a.class_foo(<span class="number">1</span>)</span><br><span class="line"><span class="comment"># executing class_foo(<class '__main__.A'>,1)</span></span><br></pre></td></tr></table></figure></p>
<p>也可以通过调用class_foo来使用类,事实上,如果你把一个东西定义成classmethod,那很有可能你试图通过类而非类的实例来调用它。A.foo(1)会引发TypeError异常,而使用A.class_foo(1)则可以正确运行。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">A.class_foo(<span class="number">1</span>)</span><br><span class="line"><span class="comment"># executing class_foo(<class '__main__.A'>,1)</span></span><br></pre></td></tr></table></figure></p>
<p>还有一种用途就是利用classmethod来创建<a href="http://stackoverflow.com/questions/1950414/what-does-classmethod-do-in-this-code/1950927#1950927" target="_blank" rel="external">可继承、可替代的构造器</a>。</p>
<p>使用staticmethod,self(对象实例)或者cls(类型)都没有作为第一个参数进行传递。它看起来和普通的函数没什么区别,除非你能从一个类的实例或者类本身调用它。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">a.static_foo(<span class="number">1</span>)</span><br><span class="line"><span class="comment"># executing static_foo(1)</span></span><br><span class="line"></span><br><span class="line">A.static_foo(<span class="string">'hi'</span>)</span><br><span class="line"><span class="comment"># executing static_foo(hi)</span></span><br></pre></td></tr></table></figure></p>
<p>staticmethod用来对类与类间有关联的函数进行分组。</p>
<p>foo只是一个函数,但是当你调用a.foo时你并不会得到这个函数,你会得到该函数的一个“局部适用”版本,并且将其与对象实例a绑定起来。foo需要两个参数,而a.foo只需要一个参数。<br>a和foo发生了绑定,下面这个例子简述了绑定的含义<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">print(a.foo)</span><br><span class="line"><span class="comment"># <bound method A.foo of <__main__.A object at 0xb7d52f0c>></span></span><br></pre></td></tr></table></figure></p>
<p>如果使用a.class_foo,则a不会和class_foo发生绑定,而是类A和class_foo发生了绑定<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">print(a.class_foo)</span><br><span class="line"><span class="comment"># <bound method type.class_foo of <class '__main__.A'>></span></span><br></pre></td></tr></table></figure></p>
<p>使用staticmethod,虽然它是一个方法,但是a.static_foo只是返回一个函数而没有参数的绑定。static_foo需要一个参数,a.static_foot同样需要一个参数。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">print(a.static_foo)</span><br><span class="line"><span class="comment"># <function static_foo at 0xb7d479cc></span></span><br></pre></td></tr></table></figure></p>
<p>类似,使用A.static_foo时也会有同样的效果<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">print(A.static_foo)</span><br><span class="line"><span class="comment"># <function static_foo at 0xb7d479cc></span></span><br></pre></td></tr></table></figure></p>
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>这٢
Python 文档随译--multiprocessing模块
http://wenqiang-china.github.io/2016/05/18/python-documentation-multiprocessing/
2016-05-18T13:32:41.969Z
2016-05-20T01:17:07.140Z
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>Python官方文档以前没有认真读,现在仔细读一遍,并且做一下随译(就是说翻译地比较随意 呵呵)。水平有限,翻译可能存在问题,请自行斟酌。<br>本文对应的官方文档链接:<a href="https://docs.python.org/2.7/library/multiprocessing.html" target="_blank" rel="external">multiprocessing</a></p>
<h3 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h3><h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><p>multiprocessing模块支持用和Treading模块API相似的语法生成进程。该模块支持本地和远程并发,利用subprocesses而不是threads,有效地避开了GIL的限制。该模块允许程序员在机器上充分利用多个CPU,该模块支持Windows和Unix平台。</p>
<p>multiprocessing模块同样提供了Threading模块所没有的,例如它提供的Pool对象,该对象具有一些方法,它可以让多个输入数据并行执行一个函数,实际上是通过将数据分配到每个进程中。下面是一个使用Pool对象实现并行化的简单例子。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> x*x</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> p = Pool(<span class="number">5</span>)</span><br><span class="line"> print(p.map(f, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]))</span><br></pre></td></tr></table></figure></p>
<p>输出为<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[1, 4, 9]</span><br></pre></td></tr></table></figure></p>
<h4 id="Process类"><a href="#Process类" class="headerlink" title="Process类"></a>Process类</h4><p>在multiprocessing模块中,可以通过Process对象创建多个进程对象,并且通过start方法来调用它们。Process采用threading.Thread,下面的例子是一个简单的多进程的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(name)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> <span class="string">'hello'</span>, name</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> p = Process(target=f, args=(<span class="string">'bob'</span>,))</span><br><span class="line"> p.start()</span><br><span class="line"> p.join()</span><br></pre></td></tr></table></figure></p>
<p>想要显示出每个进程的ID,可以参照下面的扩展例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">info</span><span class="params">(title)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> title</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'module name:'</span>, __name__</span><br><span class="line"> <span class="keyword">if</span> hasattr(os, <span class="string">'getppid'</span>): <span class="comment"># only available on Unix</span></span><br><span class="line"> <span class="keyword">print</span> <span class="string">'parent process:'</span>, os.getppid()</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'process id:'</span>, os.getpid()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(name)</span>:</span></span><br><span class="line"> info(<span class="string">'function f'</span>)</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'hello'</span>, name</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> info(<span class="string">'main line'</span>)</span><br><span class="line"> p = Process(target=f, args=(<span class="string">'bob'</span>,))</span><br><span class="line"> p.start()</span><br><span class="line"> p.join()</span><br></pre></td></tr></table></figure></p>
<h4 id="进程间交换对象"><a href="#进程间交换对象" class="headerlink" title="进程间交换对象"></a>进程间交换对象</h4><p>multiprocessing支持两种类型的对象作为进程间的交换通道。</p>
<p><strong>Queue</strong><br>Queue类几乎就是Queue.Queue类的克隆,看下面的例子:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process, Queue</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(q)</span>:</span></span><br><span class="line"> q.put([<span class="number">42</span>, <span class="keyword">None</span>, <span class="string">'hello'</span>])</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> q = Queue()</span><br><span class="line"> p = Process(target=f, args=(q,))</span><br><span class="line"> p.start()</span><br><span class="line"> <span class="keyword">print</span> q.get() <span class="comment"># prints "[42, None, 'hello']"</span></span><br><span class="line"> p.join()</span><br></pre></td></tr></table></figure></p>
<p>需要注意,Queue既是线程安全的,同时又是进程安全的。</p>
<p><strong>Pipes</strong><br>pipe方法返回一对连接对象,它们是管道的两端,默认是双向的。下面是个例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process, Pipe</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(conn)</span>:</span></span><br><span class="line"> conn.send([<span class="number">42</span>, <span class="keyword">None</span>, <span class="string">'hello'</span>])</span><br><span class="line"> conn.close()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> parent_conn, child_conn = Pipe()</span><br><span class="line"> p = Process(target=f, args=(child_conn,))</span><br><span class="line"> p.start()</span><br><span class="line"> <span class="keyword">print</span> parent_conn.recv() <span class="comment"># prints "[42, None, 'hello']"</span></span><br><span class="line"> p.join()</span><br></pre></td></tr></table></figure></p>
<p>pipe函数返回的两个连接对象表示管道的两端,每个连接对象都有send()和recv()方法。注意如果管道的两端同时从对方接收或者同时向对方发送数据则会导致数据被破坏。</p>
<h4 id="进程同步"><a href="#进程同步" class="headerlink" title="进程同步"></a>进程同步</h4><p>multiprocessing提供了和threading模块等价的同步原语。例如我们可以使用锁来确保某一时刻只有一个进程向终端输出信息。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process, Lock</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(l, i)</span>:</span></span><br><span class="line"> l.acquire()</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'hello world'</span>, i</span><br><span class="line"> l.release()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> lock = Lock()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> num <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line"> Process(target=f, args=(lock, num)).start()</span><br></pre></td></tr></table></figure></p>
<p>如果不使用锁这些信息就会混杂在一起。</p>
<h4 id="进程间共享状态"><a href="#进程间共享状态" class="headerlink" title="进程间共享状态"></a>进程间共享状态</h4><p>我们在进行并发编程时最好避免分享状态,再使用多进程时尤其要注意。<br>如果非要这么做,可以参照下面给出的 两种方式<br><strong>共享内存</strong><br>可以用Value或者Array类在共享存储区存储数据,例如下面的代码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">from multiprocessing import Process, Value, Array</span><br><span class="line"></span><br><span class="line">def f(n, a):</span><br><span class="line"> n.value = 3.1415927</span><br><span class="line"> for i in range(len(a)):</span><br><span class="line"> a[i] = -a[i]</span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> num = Value('d', 0.0)</span><br><span class="line"> arr = Array('i', range(10))</span><br><span class="line"></span><br><span class="line"> p = Process(target=f, args=(num, arr))</span><br><span class="line"> p.start()</span><br><span class="line"> p.join()</span><br><span class="line"></span><br><span class="line"> print num.value</span><br><span class="line"> print arr[:]</span><br></pre></td></tr></table></figure></p>
<p>程序将会打印如下的内容:</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">3.1415927</span></span><br><span class="line">[<span class="number">0</span>, <span class="number">-1</span>, <span class="number">-2</span>, <span class="number">-3</span>, <span class="number">-4</span>, <span class="number">-5</span>, <span class="number">-6</span>, <span class="number">-7</span>, <span class="number">-8</span>, <span class="number">-9</span>]</span><br><span class="line">``` </span><br><span class="line">参数d和i在创建num和arr时被array模块当做字节码使用,d表明是一个双精度浮点数,而i则指明一个有符号的整数类型。这些共享对象是线程和进程安全的。</span><br><span class="line">想要更灵活得使用共享内存,可以使用multiprocessing.sharedctypes,它支持从共享内存创建专门的ctype对象。</span><br><span class="line"></span><br><span class="line"><span class="comment">##服务进程##</span></span><br><span class="line">由Manager()方法返回的manager对象可以用于控制一个服务进程,它能管理Python对象并且允许其他进程通过代理操作这些数据。</span><br><span class="line">由Manager()方法返回的manager对象支持以下这些类型:list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value <span class="keyword">and</span> Array。下面举个例子</span><br><span class="line">``` Python</span><br><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process, Manager</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(d, l)</span>:</span></span><br><span class="line"> d[<span class="number">1</span>] = <span class="string">'1'</span></span><br><span class="line"> d[<span class="string">'2'</span>] = <span class="number">2</span></span><br><span class="line"> d[<span class="number">0.25</span>] = <span class="keyword">None</span></span><br><span class="line"> l.reverse()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> manager = Manager()</span><br><span class="line"></span><br><span class="line"> d = manager.dict()</span><br><span class="line"> l = manager.list(range(<span class="number">10</span>))</span><br><span class="line"></span><br><span class="line"> p = Process(target=f, args=(d, l))</span><br><span class="line"> p.start()</span><br><span class="line"> p.join()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">print</span> d</span><br><span class="line"> <span class="keyword">print</span> l</span><br></pre></td></tr></table></figure>
<p>以上代码将打印出<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{0.25: None, 1: '1', '2': 2}</span><br><span class="line">[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]</span><br></pre></td></tr></table></figure></p>
<p>服务进程管理相对于共享内存具有更高的灵活性因为它支持Python中原生的数据类型;同时一个manager对象可以为网络上不同计算机上的进程所共享,但缺点是比共享内存要慢。</p>
<h4 id="使用workers池"><a href="#使用workers池" class="headerlink" title="使用workers池"></a>使用workers池</h4><p>Pool类表示一个工作进程池,它提供了几种不同的方法将任务分发到各个进程。例如<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool, TimeoutError</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> x*x</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> pool = Pool(processes=<span class="number">4</span>) <span class="comment"># start 4 worker processes</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># print "[0, 1, 4,..., 81]"</span></span><br><span class="line"> <span class="keyword">print</span> pool.map(f, range(<span class="number">10</span>))</span><br><span class="line"></span><br><span class="line"> <span class="comment"># print same numbers in arbitrary order</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> pool.imap_unordered(f, range(<span class="number">10</span>)):</span><br><span class="line"> <span class="keyword">print</span> i</span><br><span class="line"></span><br><span class="line"> <span class="comment"># evaluate "f(20)" asynchronously</span></span><br><span class="line"> res = pool.apply_async(f, (<span class="number">20</span>,)) <span class="comment"># runs in *only* one process</span></span><br><span class="line"> <span class="keyword">print</span> res.get(timeout=<span class="number">1</span>) <span class="comment"># prints "400"</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># evaluate "os.getpid()" asynchronously</span></span><br><span class="line"> res = pool.apply_async(os.getpid, ()) <span class="comment"># runs in *only* one process</span></span><br><span class="line"> <span class="keyword">print</span> res.get(timeout=<span class="number">1</span>) <span class="comment"># prints the PID of that process</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># launching multiple evaluations asynchronously *may* use more processes</span></span><br><span class="line"> multiple_results = [pool.apply_async(os.getpid, ()) <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">4</span>)]</span><br><span class="line"> <span class="keyword">print</span> [res.get(timeout=<span class="number">1</span>) <span class="keyword">for</span> res <span class="keyword">in</span> multiple_results]</span><br><span class="line"></span><br><span class="line"> <span class="comment"># make a single worker sleep for 10 secs</span></span><br><span class="line"> res = pool.apply_async(time.sleep, (<span class="number">10</span>,))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">print</span> res.get(timeout=<span class="number">1</span>)</span><br><span class="line"> <span class="keyword">except</span> TimeoutError:</span><br><span class="line"> <span class="keyword">print</span> <span class="string">"We lacked patience and got a multiprocessing.TimeoutError"</span></span><br></pre></td></tr></table></figure></p>
<p>注意:pool的方法绝对不能被创建它的进程所使用。<br><strong>注意</strong>:这个包下面的功能需要确保<strong>main</strong>模块对于子进程是可以导入的。这意味着在一些情况下程序不能正常工作,例如在交互模式下,看下面的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="meta">>>> </span>p = Pool(<span class="number">5</span>)</span><br><span class="line"><span class="meta">>>> </span><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(x)</span>:</span></span><br><span class="line"><span class="meta">... </span> <span class="keyword">return</span> x*x</span><br><span class="line">...</span><br><span class="line"><span class="meta">>>> </span>p.map(f, [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line">Process PoolWorker<span class="number">-1</span>:</span><br><span class="line">Process PoolWorker<span class="number">-2</span>:</span><br><span class="line">Process PoolWorker<span class="number">-3</span>:</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line">AttributeError: <span class="string">'module'</span> object has no attribute <span class="string">'f'</span></span><br><span class="line">AttributeError: <span class="string">'module'</span> object has no attribute <span class="string">'f'</span></span><br><span class="line">AttributeError: <span class="string">'module'</span> object has no attribute <span class="string">'f'</span></span><br></pre></td></tr></table></figure></p>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>Python官
Python Queue介绍
http://wenqiang-china.github.io/2016/05/15/python-queue/
2016-05-15T05:29:24.341Z
2016-05-15T05:59:21.561Z
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>Python中的Queue实现了一个同步队列,并且该类实现了所有需要的锁原语。Queue实现了三种队列:普通的FIFO队列(Queue)、LIFO队列(LifoQueue)、优先级队列(PriorityQueue)。其使用方法类似,下面以普通的先进先出队列Queue为例谈一下Queue中的主要方法</p>
<h4 id="Queue中的方法及使用"><a href="#Queue中的方法及使用" class="headerlink" title="Queue中的方法及使用"></a>Queue中的方法及使用</h4><p>使用Queue<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#引入Queue类</span></span><br><span class="line"><span class="keyword">from</span> Queue <span class="keyword">import</span> Queue</span><br><span class="line"></span><br><span class="line"><span class="comment">#得到队列的大小</span></span><br><span class="line">Queue.qsize()</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断队列是否为空</span></span><br><span class="line">Queue.empty()</span><br><span class="line"></span><br><span class="line"><span class="comment">#判断队列是否已满</span></span><br><span class="line">Queue.full()</span><br><span class="line"></span><br><span class="line"><span class="comment">#从队列头获取元素,默认为阻塞</span></span><br><span class="line">Queue.get([block[,timeout]])</span><br><span class="line"></span><br><span class="line"><span class="comment">#从队列头获取元素,非阻塞方式</span></span><br><span class="line">Queue.get_nowait()</span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line">Queue.get(block=<span class="keyword">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#阻塞写入队列</span></span><br><span class="line">Queue.put(item)</span><br><span class="line"></span><br><span class="line"><span class="comment">#非阻塞写入队列</span></span><br><span class="line">Queue.put_nowait(item)</span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line">Queue.put(item,block=<span class="keyword">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#向队列中已完成的元素发送join信号</span></span><br><span class="line">Queue.task_done()</span><br></pre></td></tr></table></figure></p>
<p>上面从队列中获取元素和向队列中添加元素都有阻塞和非阻塞的方式,采用阻塞方式,如果从队列中取元素而元素为空,则线程会停下来等待知道队列中有元素可以取出;如果向队列中添加元素而此时队列已满,则同样线程会停下来直到停止。如果采用非阻塞方式,取元素时一旦队列为空,则会引发Empty异常,放元素时一旦队列已满,就会引发Full异常。</p>
<p>下面是采用Queue实现的经典生产者消费者问题的代码,来源:<a href="http://blog.itpub.net/22664653/viewspace-764044/" target="_blank" rel="external">Python模块之Queue</a><br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> Queue <span class="keyword">import</span> Queue</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="comment">#Producer thread</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Producer</span><span class="params">(threading.Thread)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, t_name, queue)</span>:</span></span><br><span class="line"> threading.Thread.__init__(self, name=t_name)</span><br><span class="line"> self.data=queue</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">run</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">5</span>):</span><br><span class="line"> <span class="keyword">print</span> <span class="string">"%s: %s is producing %d to the queue!"</span> %(time.ctime(), self.getName(), i)</span><br><span class="line"> self.data.put(i)</span><br><span class="line"> time.sleep(random.randrange(<span class="number">10</span>)/<span class="number">5</span>)</span><br><span class="line"> <span class="keyword">print</span> <span class="string">"%s: %s finished!"</span> %(time.ctime(), self.getName())</span><br><span class="line"></span><br><span class="line"><span class="comment">#Consumer thread</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Consumer</span><span class="params">(threading.Thread)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, t_name, queue)</span>:</span></span><br><span class="line"> threading.Thread.__init__(self, name=t_name)</span><br><span class="line"> self.data=queue</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">run</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">5</span>):</span><br><span class="line"> val = self.data.get()</span><br><span class="line"> <span class="keyword">print</span> <span class="string">"%s: %s is consuming. %d in the queue is consumed!"</span> %(time.ctime(), self.getName(), val)</span><br><span class="line"> time.sleep(random.randrange(<span class="number">10</span>))</span><br><span class="line"> <span class="keyword">print</span> <span class="string">"%s: %s finished!"</span> %(time.ctime(), self.getName())</span><br><span class="line"></span><br><span class="line"><span class="comment">#Main thread</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line"> queue = Queue()</span><br><span class="line"> producer = Producer(<span class="string">'Pro.'</span>, queue)</span><br><span class="line"> consumer = Consumer(<span class="string">'Con.'</span>, queue)</span><br><span class="line"> producer.start()</span><br><span class="line"> consumer.start()</span><br><span class="line"> producer.join()</span><br><span class="line"> consumer.join()</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'All threads terminate!'</span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> main()</span><br></pre></td></tr></table></figure></p>
<p>最后附上Queue模块的源码<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"""A multi-producer, multi-consumer queue."""</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> time <span class="keyword">as</span> _time</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">import</span> threading <span class="keyword">as</span> _threading <span class="comment"># 导入threading模块</span></span><br><span class="line"><span class="keyword">except</span> ImportError:</span><br><span class="line"> <span class="keyword">import</span> dummy_threading <span class="keyword">as</span> _threading <span class="comment"># 该模块的接口和thread相同,在没有实现thread模块的平台上提供thread模块的功能。</span></span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque <span class="comment"># https://github.com/BeginMan/pythonStdlib/blob/master/collections.md</span></span><br><span class="line"><span class="keyword">import</span> heapq <span class="comment"># 堆排序 https://github.com/qiwsir/algorithm/blob/master/heapq.md</span></span><br><span class="line"></span><br><span class="line">__all__ = [<span class="string">'Empty'</span>, <span class="string">'Full'</span>, <span class="string">'Queue'</span>, <span class="string">'PriorityQueue'</span>, <span class="string">'LifoQueue'</span>] <span class="comment"># 模块级别暴露接口</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Empty</span><span class="params">(Exception)</span>:</span></span><br><span class="line"> <span class="string">"""当调用Queue.get(block=0)/get_nowait()时触发Empty异常</span><br><span class="line"></span><br><span class="line"> 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。</span><br><span class="line"> 如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。</span><br><span class="line"> 如果队列为空且block为False,队列将引发Empty异常</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Full</span><span class="params">(Exception)</span>:</span></span><br><span class="line"> <span class="string">"""当调用Queue.put(block=0)/put_nowait()时触发Full异常</span><br><span class="line"></span><br><span class="line"> 如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。</span><br><span class="line"> 如果block为0,put方法将引发Full异常。</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Queue</span>:</span></span><br><span class="line"> <span class="string">"""创建一个给定的最大大小的队列对象.</span><br><span class="line"></span><br><span class="line"> FIFO(先进先出)队列, 第一加入队列的任务, 被第一个取出</span><br><span class="line"> If maxsize is <= 0, the queue size is 无限大小.</span><br><span class="line"> """</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, maxsize=<span class="number">0</span>)</span>:</span></span><br><span class="line"> self.maxsize = maxsize</span><br><span class="line"> self._init(maxsize) <span class="comment"># 初始化queue为空</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 所有获取锁的方法必须在返回之前先释放,互斥锁在下面三个Condition条件共享</span></span><br><span class="line"> <span class="comment"># 从而获取和释放的条件下也获得和释放互斥锁。</span></span><br><span class="line"> self.mutex = _threading.Lock() <span class="comment"># Lock锁</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 当添加queue元素时通知`not_empty`,之后线程等待get</span></span><br><span class="line"> self.not_empty = _threading.Condition(self.mutex) <span class="comment"># not_empty Condition实例</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 当移除queue元素时通知`not_full`,之后线程等待put.</span></span><br><span class="line"> self.not_full = _threading.Condition(self.mutex) <span class="comment"># not_full Condition实例</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 当未完成的任务数为0时,通知`all_tasks_done`,线程等待join()</span></span><br><span class="line"> self.all_tasks_done = _threading.Condition(self.mutex) <span class="comment"># all_tasks_done Condition实例</span></span><br><span class="line"> self.unfinished_tasks = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">task_done</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""表明,以前排队的任务完成了</span><br><span class="line"></span><br><span class="line"> 被消费者线程使用. 对于每个get(),随后调用task_done()告知queue这个task已经完成</span><br><span class="line"> """</span></span><br><span class="line"> self.all_tasks_done.acquire()</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="comment"># unfinished_tasks 累减</span></span><br><span class="line"> unfinished = self.unfinished_tasks - <span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> unfinished <= <span class="number">0</span>:</span><br><span class="line"> <span class="comment"># 调用多次task_done则触发异常</span></span><br><span class="line"> <span class="keyword">if</span> unfinished < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">'task_done() called too many times'</span>)</span><br><span class="line"> self.all_tasks_done.notify_all() <span class="comment"># 释放所有等待该条件的线程</span></span><br><span class="line"> self.unfinished_tasks = unfinished</span><br><span class="line"> <span class="keyword">finally</span>:</span><br><span class="line"> self.all_tasks_done.release()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">join</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""阻塞直到所有任务都处理完成</span><br><span class="line"> 未完成的task会在put()累加,在task_done()累减, 为0时,join()非阻塞.</span><br><span class="line"> """</span></span><br><span class="line"> self.all_tasks_done.acquire()</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="comment"># 一直循环检查未完成数</span></span><br><span class="line"> <span class="keyword">while</span> self.unfinished_tasks:</span><br><span class="line"> self.all_tasks_done.wait()</span><br><span class="line"> <span class="keyword">finally</span>:</span><br><span class="line"> self.all_tasks_done.release()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">qsize</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""返回队列的近似大小(不可靠!)"""</span></span><br><span class="line"> self.mutex.acquire()</span><br><span class="line"> n = self._qsize() <span class="comment"># len(queue)</span></span><br><span class="line"> self.mutex.release()</span><br><span class="line"> <span class="keyword">return</span> n</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">empty</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""队列是否为空(不可靠)."""</span></span><br><span class="line"> self.mutex.acquire()</span><br><span class="line"> n = <span class="keyword">not</span> self._qsize()</span><br><span class="line"> self.mutex.release()</span><br><span class="line"> <span class="keyword">return</span> n</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">full</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""队列是否已满(不可靠!)."""</span></span><br><span class="line"> self.mutex.acquire()</span><br><span class="line"> n = <span class="number">0</span> < self.maxsize == self._qsize()</span><br><span class="line"> self.mutex.release()</span><br><span class="line"> <span class="keyword">return</span> n</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">put</span><span class="params">(self, item, block=True, timeout=None)</span>:</span></span><br><span class="line"> <span class="string">"""添加元素.</span><br><span class="line"></span><br><span class="line"> 如果可选参数block为True并且timeout参数为None(默认), 为阻塞型put().</span><br><span class="line"> 如果timeout是正数, 会阻塞timeout时间并引发Queue.Full异常.</span><br><span class="line"> 如果block为False为非阻塞put</span><br><span class="line"> """</span></span><br><span class="line"> self.not_full.acquire()</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">if</span> self.maxsize > <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> block:</span><br><span class="line"> <span class="keyword">if</span> self._qsize() == self.maxsize:</span><br><span class="line"> <span class="keyword">raise</span> Full</span><br><span class="line"> <span class="keyword">elif</span> timeout <span class="keyword">is</span> <span class="keyword">None</span>:</span><br><span class="line"> <span class="keyword">while</span> self._qsize() == self.maxsize:</span><br><span class="line"> self.not_full.wait()</span><br><span class="line"> <span class="keyword">elif</span> timeout < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"'timeout' must be a non-negative number"</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> endtime = _time() + timeout</span><br><span class="line"> <span class="keyword">while</span> self._qsize() == self.maxsize:</span><br><span class="line"> remaining = endtime - _time()</span><br><span class="line"> <span class="keyword">if</span> remaining <= <span class="number">0.0</span>:</span><br><span class="line"> <span class="keyword">raise</span> Full</span><br><span class="line"> self.not_full.wait(remaining)</span><br><span class="line"></span><br><span class="line"> self._put(item)</span><br><span class="line"> self.unfinished_tasks += <span class="number">1</span></span><br><span class="line"> self.not_empty.notify()</span><br><span class="line"> <span class="keyword">finally</span>:</span><br><span class="line"> self.not_full.release()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">put_nowait</span><span class="params">(self, item)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> 非阻塞put</span><br><span class="line"> 其实就是将put第二个参数block设为False</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">return</span> self.put(item, <span class="keyword">False</span>)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get</span><span class="params">(self, block=True, timeout=None)</span>:</span></span><br><span class="line"> <span class="string">"""移除列队元素并将元素返回.</span><br><span class="line"></span><br><span class="line"> block = True为阻塞函数, block = False为非阻塞函数. 可能返回Queue.Empty异常</span><br><span class="line"> """</span></span><br><span class="line"> self.not_empty.acquire()</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> block:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self._qsize():</span><br><span class="line"> <span class="keyword">raise</span> Empty</span><br><span class="line"> <span class="keyword">elif</span> timeout <span class="keyword">is</span> <span class="keyword">None</span>:</span><br><span class="line"> <span class="keyword">while</span> <span class="keyword">not</span> self._qsize():</span><br><span class="line"> self.not_empty.wait()</span><br><span class="line"> <span class="keyword">elif</span> timeout < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"'timeout' must be a non-negative number"</span>)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> endtime = _time() + timeout</span><br><span class="line"> <span class="keyword">while</span> <span class="keyword">not</span> self._qsize():</span><br><span class="line"> remaining = endtime - _time()</span><br><span class="line"> <span class="keyword">if</span> remaining <= <span class="number">0.0</span>:</span><br><span class="line"> <span class="keyword">raise</span> Empty</span><br><span class="line"> self.not_empty.wait(remaining)</span><br><span class="line"> item = self._get()</span><br><span class="line"> self.not_full.notify()</span><br><span class="line"> <span class="keyword">return</span> item</span><br><span class="line"> <span class="keyword">finally</span>:</span><br><span class="line"> self.not_empty.release()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_nowait</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> 非阻塞get()</span><br><span class="line"> 也即是get()第二个参数为False</span><br><span class="line"> """</span></span><br><span class="line"> <span class="keyword">return</span> self.get(<span class="keyword">False</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Override these methods to implement other queue organizations</span></span><br><span class="line"> <span class="comment"># (e.g. stack or priority queue).</span></span><br><span class="line"> <span class="comment"># These will only be called with appropriate locks held</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 初始化队列表示</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_init</span><span class="params">(self, maxsize)</span>:</span></span><br><span class="line"> self.queue = deque() <span class="comment"># 将queue初始化为一个空的deque对象</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_qsize</span><span class="params">(self, len=len)</span>:</span> <span class="comment"># 队列长度</span></span><br><span class="line"> <span class="keyword">return</span> len(self.queue)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Put a new item in the queue</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_put</span><span class="params">(self, item)</span>:</span></span><br><span class="line"> self.queue.append(item)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Get an item from the queue</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_get</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.queue.popleft()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">PriorityQueue</span><span class="params">(Queue)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> 继承Queue</span><br><span class="line"> 构造一个优先级队列</span><br><span class="line"> maxsize设置队列大小的上界, 如果插入数据时, 达到上界会发生阻塞, 直到队列可以放入数据.</span><br><span class="line"> 当maxsize小于或者等于0, 表示不限制队列的大小(默认).</span><br><span class="line"> 优先级队列中, 最小值被最先取出</span><br><span class="line"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_init</span><span class="params">(self, maxsize)</span>:</span></span><br><span class="line"> self.queue = []</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_qsize</span><span class="params">(self, len=len)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> len(self.queue)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_put</span><span class="params">(self, item, heappush=heapq.heappush)</span>:</span></span><br><span class="line"> heappush(self.queue, item)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_get</span><span class="params">(self, heappop=heapq.heappop)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> heappop(self.queue)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">LifoQueue</span><span class="params">(Queue)</span>:</span></span><br><span class="line"> <span class="string">"""</span><br><span class="line"> 构造一LIFO(先进后出)队列</span><br><span class="line"> maxsize设置队列大小的上界, 如果插入数据时, 达到上界会发生阻塞, 直到队列可以放入数据.</span><br><span class="line"> 当maxsize小于或者等于0, 表示不限制队列的大小(默认)</span><br><span class="line"> """</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_init</span><span class="params">(self, maxsize)</span>:</span></span><br><span class="line"> self.queue = []</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_qsize</span><span class="params">(self, len=len)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> len(self.queue)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_put</span><span class="params">(self, item)</span>:</span></span><br><span class="line"> self.queue.append(item)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_get</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.queue.pop() <span class="comment"># 与Queue相比,仅仅是 将popleft()改成了pop()</span></span><br></pre></td></tr></table></figure></p>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>Python中
Python 并发编程系列--4、多进程编程方法
http://wenqiang-china.github.io/2016/05/15/python-multi-programming-4/
2016-05-15T04:44:44.815Z
2016-05-15T11:38:46.946Z
<h4 id="上一篇直通车-Python-并发编程系列–3、多线程编程方法"><a href="#上一篇直通车-Python-并发编程系列–3、多线程编程方法" class="headerlink" title="上一篇直通车 Python 并发编程系列–3、多线程编程方法"></a>上一篇直通车 <a href="../python-multi-programming-3/">Python 并发编程系列–3、多线程编程方法</a></h4><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>上一篇介绍了多线程编程,这一篇介绍多进程编程,当然应用场景是CPU密集型任务。</p>
<h3 id="分类"><a href="#分类" class="headerlink" title="分类"></a>分类</h3><p>都是采用multiprocessing模块,只不过应用的类和方法不同</p>
<ul>
<li>使用Pool对象的map方法</li>
<li>使用Pool对象的apply_async方法</li>
<li>使用Process类</li>
</ul>
<p>下面分别介绍</p>
<h4 id="使用Pool对象的map方法"><a href="#使用Pool对象的map方法" class="headerlink" title="使用Pool对象的map方法"></a>使用Pool对象的map方法</h4><p>与<a href="../python-multi-programming-3/">上一篇</a>类似,multiprocessing模块的Pool对象具有map方法,应用map方法可以很便捷地实现多线程程序。下面给出两个例子,分别来自<a href="http://www.cnblogs.com/fengjian2016/p/5261246.html" target="_blank" rel="external">python多进程(三种方法)</a>和<a href="https://segmentfault.com/a/1190000000414339" target="_blank" rel="external">一行Python实现并行化</a>。<br>首先看第一个例子,使用多线程计算0到9的平方<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(x)</span>:</span></span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"> <span class="keyword">print</span> x</span><br><span class="line"> <span class="keyword">return</span> x*x</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> p=Pool(<span class="number">5</span>)</span><br><span class="line"> <span class="keyword">print</span> (p.map(f,range(<span class="number">10</span>)))</span><br></pre></td></tr></table></figure></p>
<p>代码运行结果<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br></pre></td></tr></table></figure></p>
<p>可以看到列表是按照顺序打印的,这正是采用这种方式执行的好处:既实现了多进程,又保证了程序的执行顺序。</p>
<p>另一个例子,是生成上千张图片的缩略图,单线程版本如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os </span><br><span class="line"><span class="keyword">import</span> PIL </span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool </span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line">SIZE = (<span class="number">75</span>,<span class="number">75</span>)</span><br><span class="line">SAVE_DIRECTORY = <span class="string">'thumbs'</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_image_paths</span><span class="params">(folder)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> (os.path.join(folder, f) </span><br><span class="line"> <span class="keyword">for</span> f <span class="keyword">in</span> os.listdir(folder) </span><br><span class="line"> <span class="keyword">if</span> <span class="string">'jpeg'</span> <span class="keyword">in</span> f)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">create_thumbnail</span><span class="params">(filename)</span>:</span> </span><br><span class="line"> im = Image.open(filename)</span><br><span class="line"> im.thumbnail(SIZE, Image.ANTIALIAS)</span><br><span class="line"> base, fname = os.path.split(filename) </span><br><span class="line"> save_path = os.path.join(base, SAVE_DIRECTORY, fname)</span><br><span class="line"> im.save(save_path)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> folder = os.path.abspath(</span><br><span class="line"> <span class="string">'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840'</span>)</span><br><span class="line"> os.mkdir(os.path.join(folder, SAVE_DIRECTORY))</span><br><span class="line"></span><br><span class="line"> images = get_image_paths(folder)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> image <span class="keyword">in</span> images:</span><br><span class="line"> create_thumbnail(Image)</span><br></pre></td></tr></table></figure></p>
<p>在原文作者的机器上,处理6000章图片需要27.9秒。下面是使用map方法后的多进程版本。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os </span><br><span class="line"><span class="keyword">import</span> PIL </span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool </span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line">SIZE = (<span class="number">75</span>,<span class="number">75</span>)</span><br><span class="line">SAVE_DIRECTORY = <span class="string">'thumbs'</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_image_paths</span><span class="params">(folder)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> (os.path.join(folder, f) </span><br><span class="line"> <span class="keyword">for</span> f <span class="keyword">in</span> os.listdir(folder) </span><br><span class="line"> <span class="keyword">if</span> <span class="string">'jpeg'</span> <span class="keyword">in</span> f)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">create_thumbnail</span><span class="params">(filename)</span>:</span> </span><br><span class="line"> im = Image.open(filename)</span><br><span class="line"> im.thumbnail(SIZE, Image.ANTIALIAS)</span><br><span class="line"> base, fname = os.path.split(filename) </span><br><span class="line"> save_path = os.path.join(base, SAVE_DIRECTORY, fname)</span><br><span class="line"> im.save(save_path)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> folder = os.path.abspath(</span><br><span class="line"> <span class="string">'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840'</span>)</span><br><span class="line"> os.mkdir(os.path.join(folder, SAVE_DIRECTORY))</span><br><span class="line"></span><br><span class="line"> images = get_image_paths(folder)</span><br><span class="line"></span><br><span class="line"> pool = Pool()</span><br><span class="line"> pool.map(creat_thumbnail, images)</span><br><span class="line"> pool.close()</span><br><span class="line"> pool.join()</span><br></pre></td></tr></table></figure></p>
<p>在原文作者的机器上,这次运行只用了5.6秒,可见速度大大提升!<br><strong>注意:在使用这种方法时可能存在一些影响程序性能甚至影响程序正常执行的隐患所在,因此最好保证业务逻辑库的引用以及一些业务逻辑代码不放在Pool的map方法中,最好放在map里调用的函数中,详细信息见<a href="https://segmentfault.com/q/1010000000421911" target="_blank" rel="external">这个讨论</a></strong></p>
<h4 id="使用Pool的apply-async方法"><a href="#使用Pool的apply-async方法" class="headerlink" title="使用Pool的apply_async方法"></a>使用Pool的apply_async方法</h4><p>下面是前文提到的博客中的代码,同样完成计算0到9的平方,代码如下<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> x*x</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"> <span class="keyword">return</span> x*x</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> p=Pool(processes=<span class="number">5</span>)</span><br><span class="line"> res_list=[]</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line"> res=p.apply_async(f,[i,])</span><br><span class="line"> res_list.append(res)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> res_list:</span><br><span class="line"> <span class="keyword">print</span> item.get(),</span><br></pre></td></tr></table></figure></p>
<p>运行结果同上,仍为有序序列。不过不同的是上一次是执行完成后返回列表,而这一次一边计算一边显示(这正是使用apply_async方法的特点,函数调用是异步的)。想要详细观察效果的话建议读者在本地机器上运行比较。</p>
<h4 id="使用Process类"><a href="#使用Process类" class="headerlink" title="使用Process类"></a>使用Process类</h4><p>下面这个例子是使用multiprocessing模块中的Process类来实现的多进程,实例通过打印主进程和从进程的pid来验证属于两个进程。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">info</span><span class="params">(title)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> title</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'module_name:'</span>,__name__</span><br><span class="line"> <span class="keyword">if</span> hasattr(os,<span class="string">'getppid'</span>):<span class="comment">#仅在Unix主机上才有此属性</span></span><br><span class="line"> <span class="keyword">print</span> <span class="string">'parent process:'</span>,os.getppid()</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'process id:'</span>,os.getpid()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">f</span><span class="params">(name)</span>:</span></span><br><span class="line"> info(<span class="string">'funcion f'</span>)</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'hello'</span>,name</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> info(<span class="string">'main line'</span>)</span><br><span class="line"> p=Process(target=f,args=(<span class="string">'bob'</span>,))</span><br><span class="line"> p.start()</span><br><span class="line"> p.join()</span><br></pre></td></tr></table></figure></p>
<p>结果如下<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">main line</span><br><span class="line">module_name: __main__</span><br><span class="line">process id: 11688</span><br><span class="line">funcion f</span><br><span class="line">module_name: __main__</span><br><span class="line">process id: 10520</span><br><span class="line">hello bob</span><br></pre></td></tr></table></figure></p>
<p>通过打印出的结果可以看到通过Process对象成功创建了一个子进程。</p>
<h4 id="题外话"><a href="#题外话" class="headerlink" title="题外话"></a>题外话</h4><p>下面谈一些周边的内容,首先通过实例验证一下多进程数据区域的独立性。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>第一次运行结果<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[0[]1[</span><br><span class="line">]2</span><br><span class="line">[][5]</span><br><span class="line">[3</span><br><span class="line">4]]</span><br><span class="line">[</span><br><span class="line">6]</span><br><span class="line">[7[8]</span><br><span class="line">]</span><br><span class="line">[9]</span><br></pre></td></tr></table></figure></p>
<p>第二次运行结果<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[[01[3]</span><br><span class="line">][]</span><br><span class="line">2[</span><br><span class="line">[5]</span><br><span class="line">]4</span><br><span class="line">][</span><br><span class="line">6[]7</span><br><span class="line">[]8</span><br><span class="line">][</span><br><span class="line">9]</span><br></pre></td></tr></table></figure></p>
<h4 id="下一篇预告"><a href="#下一篇预告" class="headerlink" title="下一篇预告"></a>下一篇预告</h4><p>下一篇会谈到协程,至于什么时候就不知道了2333</p>
<h4 id="上一篇直通车-Python-并发编程系列–3、多&#x
Python 并发编程系列--3、多线程编程方法
http://wenqiang-china.github.io/2016/05/15/python-multi-programming-3/
2016-05-15T04:39:13.550Z
2016-05-15T08:36:48.729Z
<h4 id="上一篇直通车-Python-并发编程系列–2、并发方式的选择"><a href="#上一篇直通车-Python-并发编程系列–2、并发方式的选择" class="headerlink" title="上一篇直通车 Python 并发编程系列–2、并发方式的选择"></a>上一篇直通车 <a href="../python-multi-programming-2/">Python 并发编程系列–2、并发方式的选择</a></h4><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>根据前面的应用背景,这里介绍Python多线程编程时实例应用于网络爬虫–纯的I/O密集型任务。</p>
<h3 id="多线程实现方式"><a href="#多线程实现方式" class="headerlink" title="多线程实现方式"></a>多线程实现方式</h3><p>多线程在Python中有不止一种实现方式,可以通过继承Threading类,也可以单纯使用Thread类的方法,不同之处是前者是后者的封装和改进,一般用前者,因为其更加方便,当然偶尔存在需要使用Thread类才能完成的任务(如对子线程生命周期的控制,设置Threading的setDaemon方法可能不够用)。今天看到了一篇译文:<a href="http://blog.segmentfault.com/caspar/1190000000414339" target="_blank" rel="external">《一行 Python 实现并行化 – 日常多线程操作的新思路》</a>,当然也可以参照<a href="https://medium.com/building-things-on-the-internet/40e9b2b36148#66bf-f06f781cb52b" target="_blank" rel="external">原作者 Chris的文章</a>,上面提到了使用map函数实现更为简洁的线程并发方式。本文对这几种分别进行介绍。</p>
<h4 id="方法一:使用Thread类的方法"><a href="#方法一:使用Thread类的方法" class="headerlink" title="方法一:使用Thread类的方法"></a>方法一:使用Thread类的方法</h4><p>这种方式最为”原始”,最简单的使用方式是直接在需要的时候调用Thread类的start_new_thread方法,将需要并行执行的函数及其需要的参数传进去就可以了。</p>
<h4 id="方法二:使用Threading结合Queue使用"><a href="#方法二:使用Threading结合Queue使用" class="headerlink" title="方法二:使用Threading结合Queue使用"></a>方法二:使用Threading结合Queue使用</h4><p>Python中的Queue模块实现了线程安全的队列结构(Queue中使用了Threading中提供的锁实现了同步与互斥),因此使用Queue就不用担心饥饿或者死锁问题的发生了。下面是一个较为通用的I/O多线程书写模板,参照网上看到的一篇文章:<a href="http://www.68idc.cn/help/jiabenmake/python/20150119177823.html" target="_blank" rel="external">Python爬虫(六)–多线程续(Queue)</a>。关于Queue模块的介绍参见博客的另一篇文章<a href="../python-queue/">Python Queue介绍</a>,下面直接介绍多线程结合Queue的使用方法。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"><span class="keyword">import</span> Queue</span><br><span class="line"></span><br><span class="line">SHARE_Q=Queue.Queue()</span><br><span class="line"><span class="comment">#线程个数</span></span><br><span class="line">_WORKED_THERAD_NUM=<span class="number">3</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyThread</span><span class="params">(threading.Thread)</span>:</span></span><br><span class="line"> <span class="string">'''</span><br><span class="line"> 其中func为线程函数的逻辑部分</span><br><span class="line"> '''</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,func)</span>:</span></span><br><span class="line"> super(MyThread,self).__init__()</span><br><span class="line"> self.func=func</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">run</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">'''</span><br><span class="line"> 重写基类的run方法</span><br><span class="line"> '''</span></span><br><span class="line"> self.func()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">do_something</span><span class="params">(item)</span>:</span></span><br><span class="line"> <span class="string">'''</span><br><span class="line"> 运行逻辑</span><br><span class="line"> '''</span></span><br><span class="line"> <span class="keyword">print</span> item</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">worker</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="string">'''</span><br><span class="line"> 用于写工作逻辑,只要队列不空就持续处理,为空时检查队列。</span><br><span class="line"> 由于Queue中已经包含了wait notify 和响应的锁,所以不需要在取任务或者放任务的时候</span><br><span class="line"> 加锁或解锁</span><br><span class="line"> '''</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">global</span> SHARE_Q</span><br><span class="line"> <span class="keyword">while</span> <span class="keyword">not</span> SHARE_Q.empty():</span><br><span class="line"> item=SHARE_Q.get()</span><br><span class="line"> do_something(item)</span><br><span class="line"> SHARE_Q.task_done()</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">global</span> SHARE_Q</span><br><span class="line"> threads=[]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> task <span class="keyword">in</span> xrange(<span class="number">5</span>):</span><br><span class="line"> SHARE_Q.put(task)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> xrange(_WORKED_THREAD_NUM):</span><br><span class="line"> thread=MyThread(worker)</span><br><span class="line"> thread.start()</span><br><span class="line"> threads.append(thread)</span><br><span class="line"> <span class="keyword">for</span> thread <span class="keyword">in</span> threads:</span><br><span class="line"> thread.join()</span><br><span class="line"></span><br><span class="line"> SHARE_Q.join()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> main()</span><br></pre></td></tr></table></figure>
<p>注意上面有一处和原文写的不一样,在worker函数内,原文书写方式为<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="keyword">True</span>:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> SHARE_Q.empty():</span><br><span class="line"> item=SHARE_Q.get()</span><br><span class="line"> do_something(item)</span><br><span class="line"> SHARE_Q.task_done()</span><br></pre></td></tr></table></figure></p>
<p>实际使用时采取这种的方式会导致程序无法结束,怀疑是程序无法退出while循环(这块没有仔细调试,所以不能确定)。改成上面代码处的方式程序可以正常中止。这种方式可以作为一个书写的模板,在do_something函数内实现自己的逻辑,然后添加必要的变量或者控制语句,就可以实现比较简单的多线程代码。</p>
<h4 id="方法三:使用map函数和multiprocessing模块"><a href="#方法三:使用map函数和multiprocessing模块" class="headerlink" title="方法三:使用map函数和multiprocessing模块"></a>方法三:使用map函数和multiprocessing模块</h4><p>前面谈到了这是在别的博客中见到的一个比较简洁的多线程实现,刚好利用了map函数的功能。关于map函数的功能,可以看我的另一篇博客 <a href="../../02/python-functions/">Python 函数</a>,里面讲到了map函数的用法。下面直接看map函数的效果。<br>先看一下map的实现效果,下面是用map对一系列url进行访问,并将结果放到列表results中返回。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">results=map(urllib2.urlopen,[<span class="string">'https://www.baidu.com'</span>,<span class="string">'http://cn.bing.com'</span>])</span><br></pre></td></tr></table></figure></p>
<p>相当于下面的操作<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">urls=[<span class="string">'https://www.baidu.com'</span>,<span class="string">'http://cn.bing.com'</span>]</span><br><span class="line">results=[]</span><br><span class="line"><span class="keyword">for</span> url <span class="keyword">in</span> urls:</span><br><span class="line"> results.append(urllib2.urlopen(url))</span><br></pre></td></tr></table></figure></p>
<p>map函数一手包办了序列操作、参数传递和结果保存等一系列的操作。借鉴这一点,选择multiprocessing模块中的子模块就可以实现线程并发。<br>在Python中由两个库包含了map函数,multiprocessing和它的子模块multiprocessing.dummy,前者用在多进程,而后者用于多线程。两者都有pool对象(线程池或者进程池)。使用两个pool的对象方法如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Pool</span><br><span class="line"><span class="keyword">from</span> multiprocessing.dummy <span class="keyword">import</span> Pool <span class="keyword">as</span> ThreadPool</span><br></pre></td></tr></table></figure></p>
<p>Pool对象有一些参数,第一个参数用于设定线程池中的线程数,默认为CPU的核数。线程不够,优势体现得不明显;线程过多,导致线程切换花的时间太长,划不来。在实际使用中最好根据需求人为设定。下面是针对上一个问题的多线程版本。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"><span class="keyword">from</span> multiprocessing.dummy <span class="keyword">import</span> Pool <span class="keyword">as</span> ThreadPool</span><br><span class="line"></span><br><span class="line">urls=[</span><br><span class="line"><span class="string">'http://www.python.org'</span>, </span><br><span class="line"> <span class="string">'http://www.python.org/about/'</span>,</span><br><span class="line"> <span class="string">'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html'</span>,</span><br><span class="line"> <span class="string">'http://www.python.org/doc/'</span>,</span><br><span class="line"> <span class="string">'http://www.python.org/download/'</span>,</span><br><span class="line"> <span class="string">'http://www.python.org/getit/'</span>,</span><br><span class="line"> <span class="string">'http://www.python.org/community/'</span>,</span><br><span class="line"> <span class="string">'https://wiki.python.org/moin/'</span>,</span><br><span class="line"> <span class="string">'http://planet.python.org/'</span>,</span><br><span class="line"> <span class="string">'https://wiki.python.org/moin/LocalUserGroups'</span>,</span><br><span class="line"> <span class="string">'http://www.python.org/psf/'</span>,</span><br><span class="line"> <span class="string">'http://docs.python.org/devguide/'</span>,</span><br><span class="line"> <span class="string">'http://www.python.org/community/awards/'</span></span><br><span class="line"> ]</span><br><span class="line"></span><br><span class="line"><span class="comment">#设定池子的大小</span></span><br><span class="line">pool=ThreadPool(<span class="number">4</span>)</span><br><span class="line"></span><br><span class="line">results=pool.map(urllib2.urlopen,urls)</span><br><span class="line">pool.close()</span><br><span class="line">pool.join()</span><br></pre></td></tr></table></figure></p>
<p>这里面核心只有4行代码,关键只有第23行这一行。而下面则是<a href="http://www.ibm.com/developerworks/aix/library/au-threadingpython/" target="_blank" rel="external">IBM经典教程</a>中使用模型的解决方案,足足40多行。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span><br><span class="line">A more realistic thread pool example </span><br><span class="line">'''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> time </span><br><span class="line"><span class="keyword">import</span> threading </span><br><span class="line"><span class="keyword">import</span> Queue </span><br><span class="line"><span class="keyword">import</span> urllib2 </span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Consumer</span><span class="params">(threading.Thread)</span>:</span> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, queue)</span>:</span> </span><br><span class="line"> threading.Thread.__init__(self)</span><br><span class="line"> self._queue = queue </span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">run</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">while</span> <span class="keyword">True</span>: </span><br><span class="line"> content = self._queue.get() </span><br><span class="line"> <span class="keyword">if</span> isinstance(content, str) <span class="keyword">and</span> content == <span class="string">'quit'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> response = urllib2.urlopen(content)</span><br><span class="line"> <span class="keyword">print</span> <span class="string">'Bye byes!'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">Producer</span><span class="params">()</span>:</span></span><br><span class="line"> urls = [</span><br><span class="line"> <span class="string">'http://www.python.org'</span>, <span class="string">'http://www.yahoo.com'</span></span><br><span class="line"> <span class="string">'http://www.scala.org'</span>, <span class="string">'http://www.google.com'</span></span><br><span class="line"> <span class="comment"># etc.. </span></span><br><span class="line"> ]</span><br><span class="line"> queue = Queue.Queue()</span><br><span class="line"> worker_threads = build_worker_pool(queue, <span class="number">4</span>)</span><br><span class="line"> start_time = time.time()</span><br><span class="line"></span><br><span class="line"> <span class="comment"># Add the urls to process</span></span><br><span class="line"> <span class="keyword">for</span> url <span class="keyword">in</span> urls: </span><br><span class="line"> queue.put(url) </span><br><span class="line"> <span class="comment"># Add the poison pillv</span></span><br><span class="line"> <span class="keyword">for</span> worker <span class="keyword">in</span> worker_threads:</span><br><span class="line"> queue.put(<span class="string">'quit'</span>)</span><br><span class="line"> <span class="keyword">for</span> worker <span class="keyword">in</span> worker_threads:</span><br><span class="line"> worker.join()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">print</span> <span class="string">'Done! Time taken: {}'</span>.format(time.time() - start_time)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">build_worker_pool</span><span class="params">(queue, size)</span>:</span></span><br><span class="line"> workers = []</span><br><span class="line"> <span class="keyword">for</span> _ <span class="keyword">in</span> range(size):</span><br><span class="line"> worker = Consumer(queue)</span><br><span class="line"> worker.start() </span><br><span class="line"> workers.append(worker)</span><br><span class="line"> <span class="keyword">return</span> workers</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> Producer()</span><br></pre></td></tr></table></figure></p>
<p>相较之下,使用multiprocessing.dummpy中的pool对象的map方法要方便得多。</p>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>以上三种方法只是众多多线程方法中的几种,除此之外我们当然可以使用Threading模块本身而不用Queue模块实现多线程,只是要自己实现一遍封装的过程。其实归根结底还是Thread和Threading模块,通此两者,再无难事:-)</p>
<h4 id="下一篇直通车-Python-并发编程系列–4、多进程编程方法"><a href="#下一篇直通车-Python-并发编程系列–4、多进程编程方法" class="headerlink" title="下一篇直通车 Python 并发编程系列–4、多进程编程方法"></a>下一篇直通车 <a href="../python-multi-programming-4/">Python 并发编程系列–4、多进程编程方法</a></h4>
<h4 id="上一篇直通车-Python-并发编程系列–2、并&#x
Python 并发编程系列--2、并发方式的选择
http://wenqiang-china.github.io/2016/05/15/python-multi-programming-2/
2016-05-15T02:32:22.078Z
2016-05-15T04:43:29.091Z
<h4 id="上一篇直通车-Python-并发编程系列–1、浅谈GIL历史及对多线程的影响"><a href="#上一篇直通车-Python-并发编程系列–1、浅谈GIL历史及对多线程的影响" class="headerlink" title="上一篇直通车 Python 并发编程系列–1、浅谈GIL历史及对多线程的影响"></a>上一篇直通车 <a href="../python-multi-programming/">Python 并发编程系列–1、浅谈GIL历史及对多线程的影响</a></h4><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>前面说了下GIL的历史,现在站在接受GIL的角度谈何时选择多线程、何时选择多进程的问题(不接受GIL那你用Jython呐2333)。</p>
<h4 id="选择因素1–问题类型"><a href="#选择因素1–问题类型" class="headerlink" title="选择因素1–问题类型"></a>选择因素1–问题类型</h4><p>简单的说,就是看你要解决问题属于什么类型。这块大体上分为两类–CPU密集型和I/O密集型,换句话说就是偏重于计算还是侧重输入输出。例如要进行科学计算,计算量很大,那就属于CPU密集型,因为对CPU的需求占据了主体。再比如写一个爬虫程序,其中大部分时间都花在从服务器读取数据的过程中,显然是I/O密集型。</p>
<h4 id="选择因素2–多线程和多进程性能比对"><a href="#选择因素2–多线程和多进程性能比对" class="headerlink" title="选择因素2–多线程和多进程性能比对"></a>选择因素2–多线程和多进程性能比对</h4><p>关于性能比对,网上有很多比对多线程和多进程速度的例子,这里就不重复造轮子了。下面给出几个相关的链接,可以参考一下他们的测试结果。<br>这里直接给出多线程和多进程的对比结果:</p>
<ul>
<li>对于CPU密集型,效率关系:多进程>单进程(单线程)>多线程</li>
<li>对于I/O密集型,效率关系:多线程>多进程>单进程(单线程)<h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4>从以上结果不难看出,对于规模较大的问题,单进程(单线程)处理起来性能无法满足需要时就需要考虑并发了。CPU密集型的任务,用多进程;I/O密集型的任务,用多线程。<h4 id="下一篇直通车-Python-并发编程系列–3、多线程编程方法"><a href="#下一篇直通车-Python-并发编程系列–3、多线程编程方法" class="headerlink" title="下一篇直通车 Python 并发编程系列–3、多线程编程方法"></a>下一篇直通车 <a href="../python-multi-programming-3/">Python 并发编程系列–3、多线程编程方法</a></h4></li>
</ul>
<h4 id="上一篇直通车-Python-并发编程系列–1、浅&#x
Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
http://wenqiang-china.github.io/2016/05/15/python-multi-programming/
2016-05-15T01:08:07.230Z
2016-05-15T04:36:34.415Z
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>为了提高程序的运行速度,我们除了修改程序逻辑改善算法,另一个角度就是采取并发的策略。并发有两种,一种是进程的并发,另一种是线程的并发,两者有很多区别,最主要的区别:进程之间是无共享资源的,因而比较耗费内存资源,优点则是更好的安全性;而线程因为共享资源,所以相对于进程更加轻量级,缺点则是对共享数据的访问需要人为管理,即存在“线程安全”问题。</p>
<h4 id="何为线程安全"><a href="#何为线程安全" class="headerlink" title="何为线程安全"></a>何为线程安全</h4><p>线程安全是多线程编程里面的独有概念(从名字上也能看出来^_^),下面看一下wikipedia上面的解释:</p>
<blockquote>
<p>Thread safety is a computer programming concept applicable in the context of multi-threaded programs. A piece of code is thread-safe if it functions correctly during simultaneous execution by multiple threads. In particular, it must satisfy the need for multiple threads to access the same shared data, and the need for a shared piece of data to be accessed by only one thread at any given time.</p>
</blockquote>
<p>简言之,线程安全可以保证在多个线程同时执行的情况下程序可以正确执行,并且对于共享数据在任何时候只能有一个线程进行读取(我们知道产生线程死锁的一个必要条件就是互斥访问,这里面对于共享数据就是互斥访问的)。</p>
<h4 id="如何保证线程安全"><a href="#如何保证线程安全" class="headerlink" title="如何保证线程安全"></a>如何保证线程安全</h4><p>保证线程线程安全可以参照进程间对于临界资源的处理方式,加锁是比较简单的做法。为了做到线程安全,不同的编程语言采取不同的加锁方式,大体有两个级别的:细粒度的锁,仅在需要的时候才加,因为编程语言不知道你什么时候需要加锁,所以这个任务就要给编程人员去掌控,java就是采取这种策略,jython(Python 的java实现)也是采用的这个方式;粗粒度的锁,为了绝对的保证线程的安全,采取全局加锁的策略,这个由编程语言直接管理,编程人员不用操心,典型的是CPython(我们说的Python默认就是CPython)。简单的说前一种更安全,后一种更方便,作为一个手懒、饭都懒得吃的人,我比较喜欢后一种方式,把哪些琐碎的事交给编程语言去做吧。</p>
<h4 id="Python的GIL"><a href="#Python的GIL" class="headerlink" title="Python的GIL"></a>Python的GIL</h4><p>前面交代过了,正是由于全局的加锁的想法,CPython的作者(当然就是正统的Python的创造者)Guido在Python引入了GIL(Global Interpreter Lock)。每一个interperter进程,任何时候都只能有一个线程来执行,获得锁并使用资源。这种方式避免了多个线程的并发执行,因而保证了线程的安全。但是线程都无法并发执行了,那还叫多线程吗?⊙﹏⊙‖∣<br>所以对于GIL始终有两种声音:一种可以接受GIL(只是能接受,未必很喜欢),另一种认为应该去掉GIL。认为能接受的原因由两个:一、自从Python出现后,后面太多的模块都使用了Python的GIL来编写,一旦去掉GIL,这些模块都得重写,那些复杂的多线程逻辑得由程序员自己编写,代价很大;二、去掉GIL对于单线程程序会有性能的降低(在1999年就试过,移除了GIL导致单线程执行速度下降了2倍多)。认为该移除的原因主要也有两个:一、去掉GIL才能发挥多核处理器的优势。二、去掉GIL可以加快多线程程序的执行速度,实现真正的多线程。</p>
<h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>GIL方案确实不够好(从多线程并发的角度),但是单纯的移除GIL并非完美的对策:不仅把烂摊子给了程序员,而且损失了单线程的运行速度。尤其对于Python,简单和优雅是它一贯的特色,移除GIL会是多线程问题变得复杂,也没了优雅。如果真的对性能要求高,那就用Python的多进程吧,呵呵。</p>
<h4 id="下一篇直通车-Python-并发编程系列–2、并发方式的选择"><a href="#下一篇直通车-Python-并发编程系列–2、并发方式的选择" class="headerlink" title="下一篇直通车 Python 并发编程系列–2、并发方式的选择"></a>下一篇直通车 <a href="../python-multi-programming-2/">Python 并发编程系列–2、并发方式的选择</a></h4>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>为Ө
Python操作excel的几种方式--xlrd、xlwt、openpyxl
http://wenqiang-china.github.io/2016/05/13/python-opetating-excel/
2016-05-13T09:54:19.801Z
2016-05-13T13:29:30.539Z
<p>在处理excel数据时发现了xlwt的局限性–<strong>不能写入超过65535行、256列的数据</strong>(因为它只支持Excel 2003及之前的版本,在这些版本的Excel中行数和列数有此限制),这对于实际应用还是不够的。为此经过一番寻找发现了一个支持07/10/13版本Excel的openpyxl,虽然功能很强大,但是操作起来感觉没有xlwt方便。下面分别说下几个模块的常用操作。</p>
<h3 id="xlrd"><a href="#xlrd" class="headerlink" title="xlrd"></a>xlrd</h3><p>xlrd是用来从Excel中读写数据的,但我平常只用它进行读操作,写操作会遇到些问题。用xlrd进行读取比较方便,流程和平常手动操作Excel一样,打开工作簿(Workbook),选择工作表(sheets),然后操作单元格(cell)。下面举个例子,例如要打开当前目录下名为”data.xlsx”的Excel文件,选择第一张工作表,然后读取第一行的全部内容并打印出来。Python代码如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#打开excel文件</span></span><br><span class="line">data=xlrd.open_workbook(<span class="string">'data.xlsx'</span>) </span><br><span class="line"><span class="comment">#获取第一张工作表(通过索引的方式)</span></span><br><span class="line">table=data.sheets()[<span class="number">0</span>] </span><br><span class="line"><span class="comment">#data_list用来存放数据</span></span><br><span class="line">data_list=[] </span><br><span class="line"><span class="comment">#将table中第一行的数据读取并添加到data_list中</span></span><br><span class="line">data_list.extend(table.row_values(<span class="number">0</span>))</span><br><span class="line"><span class="comment">#打印出第一行的全部数据</span></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> data_list:</span><br><span class="line"> <span class="keyword">print</span> item</span><br></pre></td></tr></table></figure></p>
<p>上面的代码中读取一行用table.row_values(number),类似的读取一列用table.column_values(number),其中number为行索引,在xlrd中行和列都是从0开始索引的,因此Excel中最左上角的单元格A1是第0行第0列。<br>xlrd中读取某个单元格用table.cell(row,col)即可,其中row和col分别是单元格对应的行和列。<br>下面简单归纳一下xlrd的用法</p>
<h4 id="xlrd用法总结"><a href="#xlrd用法总结" class="headerlink" title="xlrd用法总结"></a>xlrd用法总结</h4><ul>
<li><p>打开Excel工作簿</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data=xlrd.open_workbook(filename)</span><br></pre></td></tr></table></figure>
</li>
<li><p>查看工作簿中所有sheet的名称</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data.sheet_names()</span><br></pre></td></tr></table></figure>
</li>
<li><p>选择某一个工作表(通过索引或表名称)</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#获取第一个工作表</span></span><br><span class="line">table=data.sheets()[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment">#通过索引获取第一个工作表</span></span><br><span class="line">table=data.sheet_by_index(<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#通过表名称选择工作表</span></span><br><span class="line">table=data.sheet_by_name(<span class="string">u'哈哈'</span>)</span><br></pre></td></tr></table></figure>
</li>
<li><p>获取表格的行数和列数</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nrows=table.nrows</span><br><span class="line">ncols=table.ncols</span><br></pre></td></tr></table></figure>
</li>
<li><p>获取整行和整列的值</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">table.row_values(number)</span><br><span class="line">table.column_values(number)</span><br></pre></td></tr></table></figure>
</li>
<li><p>通过循环读取表格的所有行</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> rownum <span class="keyword">in</span> xrange(table.nrows):</span><br><span class="line"> <span class="keyword">print</span> table.row_values(rownum)</span><br></pre></td></tr></table></figure>
</li>
<li><p>获取单元格的值</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">cell_A1=table.row(<span class="number">0</span>)[<span class="number">0</span>].value</span><br><span class="line"><span class="comment">#或者像下面这样</span></span><br><span class="line">cell_A1=table.cell(<span class="number">0</span>,<span class="number">0</span>).value</span><br><span class="line"><span class="comment">#或者像下面这样通过列索引</span></span><br><span class="line">cell_A1=table.col(<span class="number">0</span>)[<span class="number">0</span>].value</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>写操作自己很少用,所以就不归纳了。</p>
<h3 id="xlwt"><a href="#xlwt" class="headerlink" title="xlwt"></a>xlwt</h3><p>如果说xlrd不是一个单纯的Reader(如果把xlrd中的后两个字符看成Reader,那么xlwt后两个字符类似看成Writer),那么xlwt就是一个纯粹的Writer了,因为它只能对Excel进行写操作。xlwt和xlrd不光名字像,连很多函数和操作格式也是完全相同。下面简要归纳一下常用操作。</p>
<h4 id="xlwt常用操作"><a href="#xlwt常用操作" class="headerlink" title="xlwt常用操作"></a>xlwt常用操作</h4><p>新建一个Excel文件(只能通过新建写入)<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data=xlwt.Workbook()</span><br></pre></td></tr></table></figure></p>
<p>新建一个工作表<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">table=data.add_sheet(<span class="string">'name'</span>)</span><br></pre></td></tr></table></figure></p>
<p>写入数据到A1单元格<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">table.write(<span class="number">0</span>,<span class="number">0</span>,<span class="string">u'呵呵'</span>)</span><br></pre></td></tr></table></figure></p>
<p>注意:<strong>如果对同一个单元格重复操作,会引发overwrite Exception,想要取消该功能,需要在添加工作表时指定为可覆盖</strong>,像下面这样<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">table=data.add_sheet(<span class="string">'name'</span>,cell_overwrite_ok=<span class="keyword">True</span>)</span><br></pre></td></tr></table></figure></p>
<p>保存文件<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data.save(<span class="string">'test.xls'</span>)</span><br></pre></td></tr></table></figure></p>
<p><em>这里只能保存扩展名为xls的,xlsx的格式不支持</em></p>
<p>xlwt支持一定的样式,操作如下<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#初始化样式</span></span><br><span class="line">style=xlwt.XFStyle()</span><br><span class="line"></span><br><span class="line"><span class="comment">#为样式创建字体</span></span><br><span class="line">font=xlwt.Font()</span><br><span class="line"></span><br><span class="line"><span class="comment">#指定字体名字</span></span><br><span class="line">font.name=<span class="string">'Times New Roman'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#字体加粗</span></span><br><span class="line">font.bold=<span class="keyword">True</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#将该font设定为style的字体</span></span><br><span class="line">style.font=font</span><br><span class="line"></span><br><span class="line"><span class="comment">#写入到文件时使用该样式</span></span><br><span class="line">sheet.write(<span class="number">0</span>,<span class="number">1</span>,<span class="string">'just for test'</span>,style)</span><br></pre></td></tr></table></figure></p>
<h3 id="openpyxl"><a href="#openpyxl" class="headerlink" title="openpyxl"></a>openpyxl</h3><p>该模块支持最新版的Excel文件格式,对Excel文件具有响应的读写操作,对此有专门的Reader和Writer两个类,便于对Excel文件的操作。虽然如此,但我一般还是用默认的workbook来进行操作。常用操作归纳如下:</p>
<h4 id="openpyxl常用操作"><a href="#openpyxl常用操作" class="headerlink" title="openpyxl常用操作"></a>openpyxl常用操作</h4><p>读取Excel文件<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> openpyxl.reader.excel <span class="keyword">import</span> load_workbook</span><br><span class="line"></span><br><span class="line">wb=load_workbook(filename)</span><br></pre></td></tr></table></figure></p>
<p>显示工作表的索引范围<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wb.get_named_ranges()</span><br></pre></td></tr></table></figure></p>
<p>显示所有工作表的名字<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wb.get_sheet_names()</span><br></pre></td></tr></table></figure></p>
<p>取得第一张表<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sheetnames = wb.get_sheet_names() </span><br><span class="line">ws = wb.get_sheet_by_name(sheetnames[<span class="number">0</span>])</span><br></pre></td></tr></table></figure></p>
<p>获取表名<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ws.title</span><br></pre></td></tr></table></figure></p>
<p>获取表的行数<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ws.get_highest_row()</span><br></pre></td></tr></table></figure></p>
<p>获取表的列数<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ws.get_highest_column()</span><br></pre></td></tr></table></figure></p>
<p>单元格的读取,此处和xlrd的读取方式很相近,都是通过行和列的索引来读取<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#读取B1单元格中的内容</span></span><br><span class="line">ws.cell(<span class="number">0</span>,<span class="number">1</span>).value</span><br></pre></td></tr></table></figure></p>
<p>当然也支持通过Excel坐标来读取数据,代码如下<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#读取B1单元格中的内容</span></span><br><span class="line">ws.cell(<span class="string">"B1"</span>).value</span><br></pre></td></tr></table></figure></p>
<p>写文件,只有一种操作方式,就是通过坐标。例如要向单元格C1写数据,就要用类似ws.cell(“C1”).value=something这样的方式。<br>一般推荐的方式是用openpyxl中的Writer类来实现。代码类似下面这样:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> openpyxl.workbook <span class="keyword">import</span> Workbook </span><br><span class="line"> </span><br><span class="line"><span class="comment">#ExcelWriter,里面封装好了对Excel的写操作</span></span><br><span class="line"><span class="keyword">from</span> openpyxl.writer.excel <span class="keyword">import</span> ExcelWriter </span><br><span class="line"></span><br><span class="line"><span class="comment">#get_column_letter函数将数字转换为相应的字母,如1-->A,2-->B </span></span><br><span class="line"><span class="keyword">from</span> openpyxl.cell <span class="keyword">import</span> get_column_letter </span><br><span class="line"></span><br><span class="line"><span class="comment">#新建一个workbook </span></span><br><span class="line">wb = Workbook() </span><br><span class="line"></span><br><span class="line"><span class="comment">#新建一个excelWriter </span></span><br><span class="line">ew = ExcelWriter(workbook = wb) </span><br><span class="line"></span><br><span class="line"><span class="comment">#设置文件输出路径与名称 </span></span><br><span class="line">dest_filename = <span class="string">r'empty_book.xlsx'</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">#第一个sheet是ws </span></span><br><span class="line">ws = wb.worksheets[<span class="number">0</span>] </span><br><span class="line"></span><br><span class="line"><span class="comment">#设置ws的名称 </span></span><br><span class="line">ws.title = <span class="string">"range names"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#向某个单元格中写入数据</span></span><br><span class="line">ws.cell(<span class="string">"C1"</span>).value=<span class="string">u'哈哈'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#最后保存文件</span></span><br><span class="line">ew.save(filename=dest_filename)</span><br></pre></td></tr></table></figure></p>
<p>向某个单元格内写文件时要先知道它对应的行数和列数,这里注意<strong>行数是从1开始计数的,而列则是从字母A开始</strong>,因此第一行第一列是A1,这实际上是采用坐标方式操作Excel。例如,想向表格的第三行第一列插入一个数值1.2,用xlwt写就是table.write(2,0,1.2),因为xlwt中行列索引都从0开始;而如果用openpyxl写就是ws.cell(“A3”).value=1.2。一般对于一个较大的列数,需要通过get_column_letter函数得到相应的字符,然后再调用cell函数写入。<br>下面是我之前写的一个代码的一部分,可以用来演示将多位数组保存到Excel文件中。为了体现多维数组,这里用到了numpy,另外这里为了简化过程,没有用ExcelWriter。代码如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> openpyxl <span class="keyword">import</span> Workbook</span><br><span class="line"><span class="keyword">from</span> openpyxl.cell <span class="keyword">import</span> get_column_letter</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="comment">#生成一个对角阵</span></span><br><span class="line">a=np.diag([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment">#新建一个工作簿</span></span><br><span class="line">wb=Workbook()</span><br><span class="line"><span class="comment">#使用当前激活的工作表(默认就是Excel中的第一张表)</span></span><br><span class="line">ws=wb.active</span><br><span class="line"><span class="comment">#下面是对a的遍历,注意cell中行和列从1开始,a中索引从0开始。</span></span><br><span class="line"><span class="keyword">for</span> row <span class="keyword">in</span> xrange(<span class="number">1</span>,a.shape[<span class="number">0</span>]+<span class="number">1</span>):</span><br><span class="line"> <span class="keyword">for</span> col <span class="keyword">in</span> xrange(<span class="number">1</span>,a.shape[<span class="number">1</span>]+<span class="number">1</span>):</span><br><span class="line"> col_letter=get_column_letter(col)</span><br><span class="line"> ws.cell(<span class="string">'%s%s'</span>%(col_letter,row)).value=a[row<span class="number">-1</span>,col<span class="number">-1</span>]</span><br><span class="line">wb.save(<span class="string">'test.xlsx'</span>)</span><br></pre></td></tr></table></figure></p>
<p>暂时介绍这么多,基本够用了。</p>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>读取Excel时,选择openpyxl和xlrd差别不大,都能满足要求<br>写入少量数据且存为xls格式文件时,用xlwt更方便<br>写入大量数据(超过xls格式限制)或者必须存为xlsx格式文件时,就要用openpyxl了。</p>
<p>除以上几个模块外,还有Win32com等模块,但没有用过,就不说了。</p>
<p>在处理excel数据时发现了xlwt的局限性–<strong>不
用Python抓取携程网机票信息 过程纪实(下篇)
http://wenqiang-china.github.io/2016/05/11/get-ctrip-flights-info-2/
2016-05-10T23:47:11.016Z
2016-05-17T11:54:35.657Z
<h3 id="上篇回顾"><a href="#上篇回顾" class="headerlink" title="上篇回顾"></a>上篇回顾</h3><p>在<a href="http://wenqiang-china.github.io/2016/05/10/get-ctrip-flights-info/">上篇中</a>我们使用Python对json格式的航班数据进行了处理,因此只要能够构造出正确的URL,就可以实现对航班信息的查询。而构造URL时有三个参数需要查看js代码才可以搞定,这也正是本篇博客要处理的内容。</p>
<h3 id="从主页面找切入点"><a href="#从主页面找切入点" class="headerlink" title="从主页面找切入点"></a>从主页面找切入点</h3><p>无论是静态页面还是动态页面,最终获得的数据都要交给主页面来显示,因此从主页面中一定能得到线索。下面看一下主页面对应的html文件。<br><img src="/2016/05/11/get-ctrip-flights-info-2/mainpage.png" alt="主页面"><br>切换右侧选项到“消息头”,可以看到该网页的请求网址和浏览器中看到的请求网址相同,可以证明它确实是主页面。<br><img src="/2016/05/11/get-ctrip-flights-info-2/mainpageurl.png" alt="主页面验证"></p>
<h4 id="r值的获取"><a href="#r值的获取" class="headerlink" title="r值的获取"></a>r值的获取</h4><p>找到了主页面,下面找一下主页面中涉及到那三个参数的代码。为了参照方便,下面贴一下主页面的html代码<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br><span class="line">855</span><br><span class="line">856</span><br><span class="line">857</span><br><span class="line">858</span><br><span class="line">859</span><br><span class="line">860</span><br><span class="line">861</span><br><span class="line">862</span><br><span class="line">863</span><br><span class="line">864</span><br><span class="line">865</span><br><span class="line">866</span><br><span class="line">867</span><br><span class="line">868</span><br><span class="line">869</span><br><span class="line">870</span><br><span class="line">871</span><br><span class="line">872</span><br><span class="line">873</span><br><span class="line">874</span><br><span class="line">875</span><br><span class="line">876</span><br><span class="line">877</span><br><span class="line">878</span><br><span class="line">879</span><br><span class="line">880</span><br><span class="line">881</span><br><span class="line">882</span><br><span class="line">883</span><br><span class="line">884</span><br><span class="line">885</span><br><span class="line">886</span><br><span class="line">887</span><br><span class="line">888</span><br><span class="line">889</span><br><span class="line">890</span><br><span class="line">891</span><br><span class="line">892</span><br><span class="line">893</span><br><span class="line">894</span><br><span class="line">895</span><br><span class="line">896</span><br><span class="line">897</span><br><span class="line">898</span><br><span class="line">899</span><br><span class="line">900</span><br><span class="line">901</span><br><span class="line">902</span><br><span class="line">903</span><br><span class="line">904</span><br><span class="line">905</span><br><span class="line">906</span><br><span class="line">907</span><br><span class="line">908</span><br><span class="line">909</span><br><span class="line">910</span><br><span class="line">911</span><br><span class="line">912</span><br><span class="line">913</span><br><span class="line">914</span><br><span class="line">915</span><br><span class="line">916</span><br><span class="line">917</span><br><span class="line">918</span><br><span class="line">919</span><br><span class="line">920</span><br><span class="line">921</span><br><span class="line">922</span><br><span class="line">923</span><br><span class="line">924</span><br><span class="line">925</span><br><span class="line">926</span><br><span class="line">927</span><br><span class="line">928</span><br><span class="line">929</span><br><span class="line">930</span><br><span class="line">931</span><br><span class="line">932</span><br><span class="line">933</span><br><span class="line">934</span><br><span class="line">935</span><br><span class="line">936</span><br><span class="line">937</span><br><span class="line">938</span><br><span class="line">939</span><br><span class="line">940</span><br><span class="line">941</span><br><span class="line">942</span><br><span class="line">943</span><br><span class="line">944</span><br><span class="line">945</span><br><span class="line">946</span><br><span class="line">947</span><br><span class="line">948</span><br><span class="line">949</span><br><span class="line">950</span><br><span class="line">951</span><br><span class="line">952</span><br><span class="line">953</span><br><span class="line">954</span><br><span class="line">955</span><br><span class="line">956</span><br><span class="line">957</span><br><span class="line">958</span><br><span class="line">959</span><br><span class="line">960</span><br><span class="line">961</span><br><span class="line">962</span><br><span class="line">963</span><br><span class="line">964</span><br><span class="line">965</span><br><span class="line">966</span><br><span class="line">967</span><br><span class="line">968</span><br><span class="line">969</span><br><span class="line">970</span><br><span class="line">971</span><br><span class="line">972</span><br><span class="line">973</span><br><span class="line">974</span><br><span class="line">975</span><br><span class="line">976</span><br><span class="line">977</span><br><span class="line">978</span><br><span class="line">979</span><br><span class="line">980</span><br><span class="line">981</span><br><span class="line">982</span><br><span class="line">983</span><br><span class="line">984</span><br><span class="line">985</span><br><span class="line">986</span><br><span class="line">987</span><br><span class="line">988</span><br><span class="line">989</span><br><span class="line">990</span><br><span class="line">991</span><br><span class="line">992</span><br><span class="line">993</span><br><span class="line">994</span><br><span class="line">995</span><br><span class="line">996</span><br><span class="line">997</span><br><span class="line">998</span><br><span class="line">999</span><br><span class="line">1000</span><br><span class="line">1001</span><br><span class="line">1002</span><br><span class="line">1003</span><br><span class="line">1004</span><br><span class="line">1005</span><br><span class="line">1006</span><br><span class="line">1007</span><br><span class="line">1008</span><br><span class="line">1009</span><br><span class="line">1010</span><br><span class="line">1011</span><br><span class="line">1012</span><br><span class="line">1013</span><br><span class="line">1014</span><br><span class="line">1015</span><br><span class="line">1016</span><br><span class="line">1017</span><br><span class="line">1018</span><br><span class="line">1019</span><br><span class="line">1020</span><br><span class="line">1021</span><br><span class="line">1022</span><br><span class="line">1023</span><br><span class="line">1024</span><br><span class="line">1025</span><br><span class="line">1026</span><br><span class="line">1027</span><br><span class="line">1028</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE html></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"Cache-Control"</span> <span class="attr">content</span>=<span class="string">"no-transform "</span> /></span> </span><br><span class="line"><span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"Content-Type"</span> <span class="attr">content</span>=<span class="string">"text/html; charset=gb2312"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"description"</span> <span class="attr">content</span>=<span class="string">"携程旅行网为您提供哈尔滨到上海特价机票以及哈尔滨到上海航班查询。携程旅行网于2003年在美国纳斯达克上市,拥有覆盖全国的服务网络。提供国内国际各大航空公司的航线航班,安全支付值得信赖,是您网上订购哈尔滨到上海机票的首选。免费咨询800-820-6666。"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"keywords"</span> <span class="attr">content</span>=<span class="string">"哈尔滨到上海特价,哈尔滨到上海机票预订,哈尔滨到上海航班查询,携程机票"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">title</span>></span>哈尔滨到上海机票预订 - 哈尔滨到上海特价机票 - 哈尔滨到上海航班查询预订 - 携程国内机票预订<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge,chrome=1"</span> /></span> </span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"dns-prefetch"</span> <span class="attr">href</span>=<span class="string">"//webresource.c-ctrip.com"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"dns-prefetch"</span> <span class="attr">href</span>=<span class="string">"//pic.c-ctrip.com"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"dns-prefetch"</span> <span class="attr">href</span>=<span class="string">"//images3.c-ctrip.com"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"dns-prefetch"</span> <span class="attr">href</span>=<span class="string">"//crm.ws.ctrip.com"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"dns-prefetch"</span> <span class="attr">href</span>=<span class="string">"//s.c-ctrip.com"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"dns-prefetch"</span> <span class="attr">href</span>=<span class="string">"//www.google-analytics.com"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"canonical"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/hrb-sha-day-1.html"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"http://webresource.c-ctrip.com/ResFlightOnline/R1/Booking/css/fltdomestic111027/searchresult_v2.1.css?ReleaseNo=CR_2016_05_10_19_57_18"</span> <span class="attr">type</span>=<span class="string">"text/css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="xml"></span><br><span class="line"> var url = "http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&CK=36B05DD175F36398546F66CA5EFD07DE";</span><br><span class="line"> var _searchCount_c = 0;</span><br><span class="line"> </span><br><span class="line"> function ajaxRequest(n,t){var i=null,e,f,l,o,s,r,c,u,h;if(typeof XMLHttpRequest!="undefined")i=new XMLHttpRequest;else if(typeof ActiveXObject!="undefined"){if(typeof arguments.callee.aciveXString!="string")for(e=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],f=0,l=e.length;f<span class="tag"><<span class="name">l;f++)try{i=new</span> <span class="attr">ActiveXObject</span>(<span class="attr">e</span>[<span class="attr">f</span>]);<span class="attr">arguments.callee.activeXString</span>=<span class="string">e[f];break}catch(a){}i</span>==<span class="string">null&&(i</span>=<span class="string">new</span> <span class="attr">ActiveXObject</span>(<span class="attr">arguments.callee.activeXString</span>))}<span class="attr">i.onreadystatechange</span>=<span class="string">function(){try{if(i.readyState</span>==<span class="string">4)if(i.status</span>></span>=200&&i.status<span class="tag"><<span class="name">300||i.status==304){var</span> <span class="attr">r</span>=<span class="string">eval(</span>"("+<span class="attr">i.responseText</span>+")");<span class="attr">if</span>(<span class="attr">_searchCount_c</span>==<span class="string">0&&r&&r.Error&&r.Error.Code</span>==<span class="string">104&&(r.Error.Message</span>==<span class="string">""</span>||!<span class="attr">r.Error.Message</span>)){<span class="attr">_searchCount_c</span>++;<span class="attr">setTimeout</span>(<span class="attr">function</span>(){<span class="attr">var</span> <span class="attr">i</span>=<span class="string">n.split(</span>"&");<span class="attr">i.pop</span>();<span class="attr">ajaxRequest</span>(<span class="attr">i.join</span>("&")+"&<span class="attr">rt</span>=<span class="string">"+Math.random()*1e3,t)},1e3);return}jsonCallback.done(r)}else i.status!=0&&jsonCallback.onError()}catch(u){jsonCallback.onError()}};window.location.hash&&(o=window.location.hash.match(/DDate1=\d{4}-\d{2}-\d{2}/),o&&o.length>0&&(n=n.replace(/DDate1=(\d{4}-\d{2}-\d{2})/ig,o[0])),s=window.location.hash.match(/DDate2=\d{4}-\d{2}-\d{2}/),s&&s.length>0&&(n=n.replace(/DDate2=(\d{4}-\d{2}-\d{2})/ig,s[0])));r=n.replace(/^[\s\xA0]+|[\s\xA0]+$/g,"</span>");(<span class="attr">r.indexOf</span>("<span class="attr">ClassType</span>=<span class="string">CF</span>")==<span class="string">-1||r.indexOf(</span>"<span class="attr">ClassType</span>=<span class="string">&</span>")!=<span class="string">-1)&&(r+</span>=<span class="string">getStorage(</span>"<span class="attr">FD_SearchPage_onlyCf</span>")==<span class="string">"CF"</span>?"&<span class="attr">ClassType</span>=<span class="string">CF</span>"<span class="attr">:</span>"");<span class="attr">_searchCount_c</span>></span>0&&(c=t.split(".")[1],t="0."+c.substring(1,c.length-1));u=r.split("&");h=r.indexOf("rk=")>=0||r.indexOf("rt=")>=0?u.splice(u.length-2,1)[0]:u.pop();u.push("CK=");h=h.split("=")[1];var fn=(function(u,r,k,t){var M48=1,N48M=1;M48=M48-=parseInt(Math.log(8) * 0xa);M48=M48-=parseInt(Math.sin(8) * 0xa);if(M48<span class="tag"><<span class="name">0)M48=-M48;</span> <span class="attr">while</span>(<span class="attr">M48</span>></span>30)M48=M48%10;N48M=N48M+=parseInt(Math.exp(6) * 0xa);N48M=N48M+=parseInt(Math.sin(6) * 0xa);N48M=N48M+=parseInt(Math.log(6) * 0xa);if(N48M<span class="tag"><<span class="name">0)N48M=-N48M;</span> <span class="attr">while</span>(<span class="attr">N48M</span>></span>30)N48M=N48M%10;(function(r,u,x,y,t,k){if(!window.location.href){return;}var l=r.split(''); var c=l.splice(y,1);l.splice(x,0,c);t.open('GET', u.join('&')+l.join('') + '&r=' + k, !0);t.send(null);})(r,u,M48,N48M,t,k)});fn(u,h,t,i)}var jsonCallback={isError:!1,isReady:!1,data:{},readyList:[],errorList:[],ready:function(n){this.isReady==!1?this.readyList.push(n):n(this.data)},done:function(n){this.isReady=!0;this.data=n;for(var t=0;this.readyList[t];)this.readyList[t](n),t++},error:function(n){this.isError==!1?this.errorList.push(n):n()},onError:function(){this.isError=!0;for(var n=0;this.errorList[n];)this.errorList[n](),n++}},getStorage=function(n){var i,r,t;try{if(i="{}",window.localStorage)i=localStorage.getItem("jStorage");else if(window.globalStorage)i=window.globalStorage[window.location.hostname];else{r=document.head||document.getElementsByTagName("head")[0];t=document.createElement("link");t.style.behavior="url(#default#userData)";r.appendChild(t);try{t.load("jStorage")}catch(u){t.setAttribute("jStorage","{}");t.save("jStorage");t.load("jStorage")}i=t.getAttribute("jStorage")||"{}";r.removeChild(t)}return!i||i=="{}"?"":eval("("+i+")")[n]}catch(f){return""}}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> var searchRouteIndex = "0";</span><br><span class="line"> ajaxRequest(url + '&rk=' + Math.random()*10+'071048','0.1735286780048523741211');</span><br><span class="line"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"CorrelationId"</span> <span class="attr">name</span>=<span class="string">"CorrelationId"</span> <span class="attr">value</span>=<span class="string">"3480328985819705290"</span>/></span><span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"http://webresource.c-ctrip.com/ResCRMOnline/R1/pageheader/css/PageHeader_v2.css?temp=20160510"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> /></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_hd_cont"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"cui_hd"</span> <span class="attr">class</span>=<span class="string">"cui_hd"</span>></span><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"_searchboxNo_"</span> <span class="attr">value</span>=<span class="string">"ws_www20140409"</span>></span><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"_newHeaderFlag_"</span> <span class="attr">value</span>=<span class="string">"true"</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"ctriplogo"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.com"</span> <span class="attr">title</span>=<span class="string">"携程旅行网"</span>></span>携程旅行网<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"nav-bar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"language"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.com/"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">class</span>=<span class="string">"selected"</span> <span class="attr">id</span>=<span class="string">"cui_lang_cn"</span> <span class="attr">onmouseover</span>=<span class="string">"this.className= 'selected language_current';document.getElementById('cui_lang_list').parentNode.style.display='block';"</span> <span class="attr">onmouseout</span>=<span class="string">"this.className= 'selected';document.getElementById('cui_lang_list').parentNode.style.display='none';"</span>></span><span class="tag"><<span class="name">span</span>></span><span class="tag"><<span class="name">em</span> <span class="attr">class</span>=<span class="string">"ico-langgb"</span>></span><span class="tag"></<span class="name">em</span>></span>简体中文<span class="tag"><<span class="name">b</span> <span class="attr">class</span>=<span class="string">"arrow"</span>></span><span class="tag"></<span class="name">b</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"language_wrap drowndrop"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span> <span class="attr">onmouseover</span>=<span class="string">"document.getElementById('cui_lang_cn').className= 'selected language_current';this.style.display='block';"</span> <span class="attr">onmouseout</span>=<span class="string">"document.getElementById('cui_lang_cn').className= 'selected';this.style.display='none';"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"language_list"</span> <span class="attr">id</span>=<span class="string">"cui_lang_list"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"first"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_hk"</span> <span class="attr">class</span>=<span class="string">"language_hk"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.com.hk?language=HK#from=click_hk"</span>></span>香港(繁体)<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_hk_en"</span> <span class="attr">class</span>=<span class="string">"language_hk"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.com.hk/?language=EN#from=click_hken"</span>></span>Hong Kong(English)<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_eng"</span> <span class="attr">class</span>=<span class="string">"language_en"</span> <span class="attr">href</span>=<span class="string">"http://english.ctrip.com/#from=click_en"</span>></span>English<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_jap"</span> <span class="attr">class</span>=<span class="string">"language_jap"</span> <span class="attr">href</span>=<span class="string">"http://jp.ctrip.com/#from=click_jp"</span>></span>日语版<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_korea"</span> <span class="attr">class</span>=<span class="string">"language_korea"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.co.kr/#from=click_kr"</span>></span>韩语版<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_sg"</span> <span class="attr">class</span>=<span class="string">"language_sg"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.sg/#from=click_sg"</span>></span>Singapore<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_id"</span> <span class="attr">class</span>=<span class="string">"language_id"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.co.id/#from=click_id"</span>></span>Bahasa Indonesia<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_my"</span> <span class="attr">class</span>=<span class="string">"language_my"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.my/#from=click_my"</span>></span>Bahasa Malaysia<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_th"</span> <span class="attr">class</span>=<span class="string">"language_th"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.co.th/#from=click_th"</span>></span>&#xE20;&#xE32;&#xE29;&#xE32;&#xE44;&#xE17;&#xE22;<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_fr"</span> <span class="attr">class</span>=<span class="string">"language_fr"</span> <span class="attr">href</span>=<span class="string">"http://fr.ctrip.com/#from=click_fr"</span>></span>Fran&#xE7;ais<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_de"</span> <span class="attr">class</span>=<span class="string">"language_de"</span> <span class="attr">href</span>=<span class="string">"http://de.ctrip.com/#from=click_de"</span>></span>Deutsch<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_es"</span> <span class="attr">class</span>=<span class="string">"language_es"</span> <span class="attr">href</span>=<span class="string">"http://es.ctrip.com/#from=click_es"</span>></span>Espa&#xF1;ol<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"last"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"ctrip_ru"</span> <span class="attr">class</span>=<span class="string">"language_ru"</span> <span class="attr">href</span>=<span class="string">"http://ru.ctrip.com/#from=click_ru"</span>></span>Русский<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_service"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://kefu.ctrip.com"</span>></span>客服中心</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_service service_1180"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#"</span> <span class="attr">class</span>=<span class="string">"service_tel"</span> <span class="attr">id</span>=<span class="string">"cui_service_cn"</span> <span class="attr">onmouseover</span>=<span class="string">"this.className= 'service_tel service_current';document.getElementById('cui_service_tel_list').style.display='block';"</span> <span class="attr">onmouseout</span>=<span class="string">"this.className= 'service_tel';document.getElementById('cui_service_tel_list').style.display='none';"</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">title</span>=<span class="string">"免境内长话费"</span>></span></span><br><span class="line"> 国内:<span class="tag"><<span class="name">em</span> <span class="attr">class</span>=<span class="string">"service_telnum"</span>></span>1010-6666<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">b</span> <span class="attr">class</span>=<span class="string">"arrow"</span>></span><span class="tag"></<span class="name">b</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"service_wrap drowndrop"</span> <span class="attr">id</span>=<span class="string">"cui_service_tel_list"</span> <span class="attr">onmouseover</span>=<span class="string">"document.getElementById('cui_service_cn').className= 'service_tel service_current';this.style.display='block';"</span> <span class="attr">onmouseout</span>=<span class="string">"document.getElementById('cui_service_cn').className= 'service_tel';document.getElementById('cui_service_tel_list').style.display='none';"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"service_list"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dl</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">style</span>=<span class="string">"color:#999"</span>></span>(或)<span class="tag"></<span class="name">span</span>></span><span class="tag"><<span class="name">em</span>></span>400-820-6666<span class="tag"></<span class="name">em</span>></span><span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span></span><br><span class="line"> 香港:<span class="tag"><<span class="name">em</span>></span>+852-3069-9966<span class="tag"></<span class="name">em</span>></span><span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span></span><br><span class="line"> 海外:<span class="tag"><<span class="name">em</span>></span>+86-21-3406-4888<span class="tag"></<span class="name">em</span>></span><span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dl</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_wireless"</span> <span class="attr">id</span>=<span class="string">"head_float_level"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://app.ctrip.com"</span> <span class="attr">class</span>=<span class="string">"wireless wireless_link"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">id</span>=<span class="string">"linkid"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_app"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"head_float_box_app"</span> <span class="attr">class</span>=<span class="string">"cui_wireless_box"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_chatarrow"</span> <span class="attr">style</span>=<span class="string">"right:40px;"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_wireless_inbox"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dl</span> <span class="attr">class</span>=<span class="string">"cui_wireless_type"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dt</span>></span>手机扫码快速下载<span class="tag"></<span class="name">dt</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"//pic.c-ctrip.com/platform/online/home/er_ctrip_app.jpg"</span> <span class="attr">alt</span>=<span class="string">""</span>></span><span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dl</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://app.ctrip.com"</span> <span class="attr">class</span>=<span class="string">"cui_link_app"</span>></span>携程旅行手机版<span class="tag"><<span class="name">i</span>></span>&gt;<span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"##"</span> <span class="attr">class</span>=<span class="string">"wireless wireless_nolink"</span> <span class="attr">id</span>=<span class="string">"nolinkid"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_wechat"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"head_float_box_weixin"</span> <span class="attr">class</span>=<span class="string">"cui_wireless_box"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_chatarrow"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_wireless_inbox"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dl</span> <span class="attr">class</span>=<span class="string">"cui_wireless_type"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dt</span>></span>携程订阅号:helloctrip<span class="tag"></<span class="name">dt</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"//pic.c-ctrip.com/platform/online/home/er_ctrip_wechat.jpg"</span> <span class="attr">alt</span>=<span class="string">""</span>></span><span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dl</span>></span></span><br><span class="line"> 扫一扫,领旅行福利</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">""</span> <span class="attr">id</span>=<span class="string">"ctrip_doodle"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"cui_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"base_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">id</span>=<span class="string">"cui_nav_ul"</span> <span class="attr">class</span>=<span class="string">"cui_nav cui_content"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_home"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"首页"</span> <span class="attr">class</span>=<span class="string">"cui_nav_non"</span> <span class="attr">id</span>=<span class="string">"c_ph_hp"</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.com"</span>></span>首页<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_hotel"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"a_hotelLink"</span> <span class="attr">titledec</span>=<span class="string">"酒店"</span> <span class="attr">class</span>=<span class="string">"cui_nav_hotel cui_nav_has"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com"</span>></span>酒店</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span> <span class="attr">id</span>=<span class="string">"div_hotel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国内酒店"</span> <span class="attr">id</span>=<span class="string">"c_ph_hotel_h"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com"</span>></span>国内酒店</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"海外酒店"</span> <span class="attr">id</span>=<span class="string">"c_ph_hoteli_h"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/international/"</span>></span>海外酒店</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"海外民宿+短租"</span> <span class="attr">id</span>=<span class="string">"c_ph_apartment_h"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/apartment"</span>></span>海外民宿+短租<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>NEW<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"团购"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuan_h"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com"</span>></span>团购</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"特价酒店"</span> <span class="attr">id</span>=<span class="string">"c_ph_hotsale_h"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/hotsale"</span>></span>特价酒店</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">titledec</span>=<span class="string">"途家公寓"</span> <span class="attr">id</span>=<span class="string">"c_ph_tujia_h"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/tujia/"</span>></span>途家公寓</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"酒店+景点"</span> <span class="attr">id</span>=<span class="string">"c_ph_taocanj_v"</span> <span class="attr">href</span>=<span class="string">"http://taocan.ctrip.com/sh/HotelDefault.aspx?fluxentrance=10405&amp;FromMenu=hotel"</span>></span>酒店+景点</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"客栈民宿"</span> <span class="attr">id</span>=<span class="string">"c_ph_inn_h"</span> <span class="attr">href</span>=<span class="string">"http://inn.ctrip.com"</span>></span>客栈民宿</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"会场+团队房"</span> <span class="attr">id</span>=<span class="string">"c_ph_meeting_h"</span> <span class="attr">href</span>=<span class="string">"http://meeting.ctrip.com"</span>></span>会场+团队房</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/HotelOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-hotel"</span>></span><span class="tag"></<span class="name">i</span>></span>酒店订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_vac"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"a_vacationLink"</span> <span class="attr">titledec</span>=<span class="string">"旅游"</span> <span class="attr">class</span>=<span class="string">"cui_nav_vac cui_nav_has"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com"</span>></span>旅游</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span> <span class="attr">id</span>=<span class="string">"div_vacation"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"旅游首页"</span> <span class="attr">id</span>=<span class="string">"c_ph_vacations_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com"</span>></span>旅游首页</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"周末游"</span> <span class="attr">id</span>=<span class="string">"c_ph_around_v"</span> <span class="attr">href</span>=<span class="string">"http://you.ctrip.com/around/"</span>></span>周末游</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"跟团游"</span> <span class="attr">id</span>=<span class="string">"c_ph_vacationsd_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/grouptravel/"</span>></span>跟团游</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"自由行"</span> <span class="attr">id</span>=<span class="string">"c_ph_taocan_v"</span> <span class="attr">href</span>=<span class="string">"http://taocan.ctrip.com"</span>></span>自由行</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"邮轮"</span> <span class="attr">id</span>=<span class="string">"c_ph_cruise_v"</span> <span class="attr">href</span>=<span class="string">"http://cruise.ctrip.com/"</span>></span>邮轮</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"酒店+景点"</span> <span class="attr">id</span>=<span class="string">"c_ph_taocanj_v"</span> <span class="attr">href</span>=<span class="string">"http://taocan.ctrip.com/sh/"</span>></span>酒店+景点<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-cn"</span>></span><span class="tag"><<span class="name">em</span>></span>自驾游<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"当地玩乐"</span> <span class="attr">id</span>=<span class="string">"c_ph_huodong_v"</span> <span class="attr">href</span>=<span class="string">"http://huodong.ctrip.com/"</span>></span>当地玩乐</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"主题游"</span> <span class="attr">id</span>=<span class="string">"c_ph_zhutiyou_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/themetravel/"</span>></span>主题游<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>NEW<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"定制&#x2022;包团"</span> <span class="attr">id</span>=<span class="string">"c_ph_baotuan_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/dingzhi"</span>></span>定制&#x2022;包团</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"游学"</span> <span class="attr">id</span>=<span class="string">"c_ph_youxue_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/youxue"</span>></span>游学</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"签证"</span> <span class="attr">id</span>=<span class="string">"c_ph_visa_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/visa"</span>></span>签证</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"企业会奖"</span> <span class="attr">id</span>=<span class="string">"c_ph_mice_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/mice"</span>></span>企业会奖</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"顶级游"</span> <span class="attr">href</span>=<span class="string">"http://www.hhtravel.com/#ctm_ref=hh_ct_thp_nav"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">id</span>=<span class="string">"c_ph_hh_v"</span>></span>顶级游<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"爱玩户外"</span> <span class="attr">id</span>=<span class="string">"c_ph_golf_v"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/ctt/marketing/"</span>></span>爱玩户外</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"保险"</span> <span class="attr">id</span>=<span class="string">"c_ph_insurance_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/insurance"</span>></span>保险</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"特卖汇"</span> <span class="attr">id</span>=<span class="string">"c_ph_deals_v"</span> <span class="attr">href</span>=<span class="string">"http://vacations.ctrip.com/deals"</span>></span>特卖汇</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/PkgOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-vacations"</span>></span><span class="tag"></<span class="name">i</span>></span>旅游订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_flight"</span> <span class="attr">class</span>=<span class="string">"cui_nav_current"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"a_flightLink"</span> <span class="attr">titledec</span>=<span class="string">"机票"</span> <span class="attr">class</span>=<span class="string">"cui_nav_flight cui_nav_has"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com"</span>></span>机票</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">id</span>=<span class="string">"div_flight"</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国内机票"</span> <span class="attr">id</span>=<span class="string">"c_ph_flights_f"</span> <span class="attr">class</span>=<span class="string">"cui_sub_current"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com"</span>></span>国内机票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国际机票"</span> <span class="attr">id</span>=<span class="string">"c_ph_flightsi_f"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/international/"</span>></span>国际机票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"机+酒"</span> <span class="attr">id</span>=<span class="string">"c_ph_taocan_f"</span> <span class="attr">href</span>=<span class="string">"http://taocan.ctrip.com"</span>></span>机+酒</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"航班动态"</span> <span class="attr">id</span>=<span class="string">"c_ph_flightstoolbox_f"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime"</span>></span>航班动态</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">titledec</span>=<span class="string">"值机选座"</span> <span class="attr">id</span>=<span class="string">"c_ph_bookseat_f"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/domestic/checkinseat/index"</span>></span>值机选座</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">titledec</span>=<span class="string">"退票改签"</span> <span class="attr">id</span>=<span class="string">"c_ph_flightorderlist_f"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/FlightOrderList.aspx"</span>></span>退票改签</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">titledec</span>=<span class="string">"机场攻略"</span> <span class="attr">id</span>=<span class="string">"c_ph_airportguides_f"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/airport-guides.html"</span>></span>机场攻略</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"机场巴士"</span> <span class="attr">id</span>=<span class="string">"c_ph_airbus_f"</span> <span class="attr">href</span>=<span class="string">"http://airbus.ctrip.com#ctm_ref=arb_hp_flt_nang"</span>></span>机场巴士</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"公务员通道"</span> <span class="attr">id</span>=<span class="string">"c_ph_gwytd_f"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/Domestic/Civs"</span>></span>公务员通道<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>NEW<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/FlightOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-flight"</span>></span><span class="tag"></<span class="name">i</span>></span>机票订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_trains"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"火车"</span> <span class="attr">class</span>=<span class="string">"cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_train"</span> <span class="attr">href</span>=<span class="string">"http://trains.ctrip.com"</span>></span>火车</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国内火车票"</span> <span class="attr">id</span>=<span class="string">"c_ph_train_t"</span> <span class="attr">href</span>=<span class="string">"http://trains.ctrip.com"</span>></span>国内火车票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国际&#x2022;台湾火车票"</span> <span class="attr">id</span>=<span class="string">"c_ph_traino_t"</span> <span class="attr">href</span>=<span class="string">"http://rails.ctrip.com"</span>></span>国际&#x2022;台湾火车票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/RailwayOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-train"</span>></span><span class="tag"></<span class="name">i</span>></span>火车票订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_destination"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"汽车票"</span> <span class="attr">class</span>=<span class="string">"cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_bus"</span> <span class="attr">href</span>=<span class="string">"http://Bus.ctrip.com"</span>></span>汽车票</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"汽车票"</span> <span class="attr">id</span>=<span class="string">"c_ph_bus_t"</span> <span class="attr">href</span>=<span class="string">"http://Bus.ctrip.com"</span>></span>汽车票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"机场巴士"</span> <span class="attr">id</span>=<span class="string">"c_ph_airbus_t"</span> <span class="attr">href</span>=<span class="string">"http://airbus.ctrip.com#ctm_ref=arb_hp_bus_nang"</span>></span>机场巴士</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"船票"</span> <span class="attr">id</span>=<span class="string">"c_ph_ship_t"</span> <span class="attr">href</span>=<span class="string">"http://Bus.ctrip.com/ship"</span>></span>船票<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>NEW<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/QicheOrderlist.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-bus"</span>></span><span class="tag"></<span class="name">i</span>></span>汽车票订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_car"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"用车"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com/#ctm_ref=chp_var_txt"</span> <span class="attr">class</span>=<span class="string">"cui_nav_hotel cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_car"</span>></span>用车</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"用车首页"</span> <span class="attr">id</span>=<span class="string">"c_ph_car_c"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com#ctm_ref=chp_var_txt"</span>></span>用车首页</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国际租车"</span> <span class="attr">id</span>=<span class="string">"c_ph_hwzj_c"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com/hwzijia#ctm_ref=chp_var_txt"</span>></span>国际租车<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-cn"</span>></span><span class="tag"><<span class="name">em</span>></span>特惠<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国际接送机"</span> <span class="attr">id</span>=<span class="string">"c_ph_hwdaijia_c"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com/hwdaijia#ctm_ref=chp_var_txt"</span>></span>国际接送机</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国内租车"</span> <span class="attr">id</span>=<span class="string">"c_ph_zj_c"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com/zijia#ctm_ref=chp_var_txt"</span>></span>国内租车</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国内接送机/火车"</span> <span class="attr">id</span>=<span class="string">"c_ph_daijia_c"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com/daijia#ctm_ref=chp_var_txt"</span>></span>国内接送机/火车</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"日租包车"</span> <span class="attr">id</span>=<span class="string">"c_ph_rizu_c"</span> <span class="attr">href</span>=<span class="string">"http://car.ctrip.com/dayweb"</span>></span>日租包车<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>NEW<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/CarOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-car"</span>></span><span class="tag"></<span class="name">i</span>></span>用车订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_ticket"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"门票"</span> <span class="attr">class</span>=<span class="string">"cui_nav_ticket cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_piao"</span> <span class="attr">href</span>=<span class="string">"http://piao.ctrip.com"</span>></span>门票</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"国内门票"</span> <span class="attr">id</span>=<span class="string">"c_ph_piao_p"</span> <span class="attr">href</span>=<span class="string">"http://piao.ctrip.com/?clear=t#ctm_ref=tkt_home_tab_inland"</span>></span>国内门票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"海外门票"</span> <span class="attr">id</span>=<span class="string">"c_ph_piaooversea_p"</span> <span class="attr">href</span>=<span class="string">"http://piao.ctrip.com/oversea#ctm_ref=tkt_home_tab_oversea"</span>></span>海外门票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"当地玩乐"</span> <span class="attr">id</span>=<span class="string">"c_ph_huodong_p"</span> <span class="attr">href</span>=<span class="string">"http://huodong.ctrip.com#ctm_ref=ctr_hp_ttd"</span>></span>当地玩乐<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>NEW<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"出境WiFi"</span> <span class="attr">id</span>=<span class="string">"c_ph_wifi_p"</span> <span class="attr">href</span>=<span class="string">"http://huodong.ctrip.com/wifi#ctm_ref=ctr_hp_wifi"</span>></span>出境WiFi</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"周末游"</span> <span class="attr">id</span>=<span class="string">"c_ph_around_p"</span> <span class="attr">href</span>=<span class="string">"http://you.ctrip.com/around#ctm_ref=gs-990123-290801-0-02-M001|0|0"</span>></span>周末游</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span> <span class="attr">style</span>=<span class="string">"display:none"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"迪士尼"</span> <span class="attr">id</span>=<span class="string">"c_ph_disney_p"</span> <span class="attr">style</span>=<span class="string">"display:none"</span> <span class="attr">href</span>=<span class="string">"http://pages.c-ctrip.com/commerce/promote/201603/vacation/disney/online.html"</span>></span>迪士尼</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/PiaoOrderlist.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-ticket"</span>></span><span class="tag"></<span class="name">i</span>></span>门票订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_tuan"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuan"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com"</span>></span>团购</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"团购首页"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuan_tu"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com"</span>></span>团购首页</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"酒店"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuanhotel_tu"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com/hotel/"</span>></span>酒店</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"门票"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuanticket_tu"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com/ticket/"</span>></span>门票</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"旅游"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuantravel_tu"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com/travel/"</span>></span>旅游</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"美食"</span> <span class="attr">id</span>=<span class="string">"c_ph_tuanlife_tu"</span> <span class="attr">href</span>=<span class="string">"http://tuan.ctrip.com/life/"</span>></span>美食</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/GroupOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-tuan"</span>></span><span class="tag"></<span class="name">i</span>></span>团购订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_destination01"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"攻略"</span> <span class="attr">class</span>=<span class="string">"cui_nav_non"</span> <span class="attr">id</span>=<span class="string">"c_ph_you"</span> <span class="attr">href</span>=<span class="string">"http://you.ctrip.com"</span>></span>攻略<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_g"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"全球购"</span> <span class="attr">class</span>=<span class="string">"cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_go"</span> <span class="attr">href</span>=<span class="string">"http://g.ctrip.com"</span>></span>全球购</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span> <span class="attr">id</span>=<span class="string">"div_global"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"名店购"</span> <span class="attr">id</span>=<span class="string">"c_ph_mdg_g"</span> <span class="attr">href</span>=<span class="string">"http://g.ctrip.com"</span>></span>名店购</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"退税"</span> <span class="attr">id</span>=<span class="string">"c_ph_ts_g"</span> <span class="attr">href</span>=<span class="string">"http://tax.ctrip.com/?bid=2&amp;cid=1&amp;pid=1"</span>></span>退税</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"刷卡奖励"</span> <span class="attr">id</span>=<span class="string">"c_ph_skjl_g"</span> <span class="attr">href</span>=<span class="string">"http://card.ctrip.com/#ctm_ref=ctr_bid_0_cid_1_pid_1"</span>></span>刷卡奖励</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_lpk"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_lipin"</span> <span class="attr">href</span>=<span class="string">"http://lipin.ctrip.com"</span>></span>礼品卡</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"礼品卡"</span> <span class="attr">id</span>=<span class="string">"c_ph_lipin_l"</span> <span class="attr">href</span>=<span class="string">"http://lipin.ctrip.com"</span>></span>礼品卡首页</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"礼品卡套餐"</span> <span class="attr">id</span>=<span class="string">"c_ph_xcb_l"</span> <span class="attr">href</span>=<span class="string">"http://lipin.ctrip.com/xcb"</span>></span>礼品卡套餐</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"存款证明"</span> <span class="attr">id</span>=<span class="string">"c_ph_ckzm_l"</span> <span class="attr">href</span>=<span class="string">"http://jr.ctrip.com/deposit/deposit/index"</span>></span>存款证明</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"cui_ico_order"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/TicketOrderList.aspx"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui-icon-card"</span>></span><span class="tag"></<span class="name">i</span>></span>礼品卡订单 &gt;</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_sl"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"商旅"</span> <span class="attr">class</span>=<span class="string">"cui_nav_has"</span> <span class="attr">id</span>=<span class="string">"c_ph_crptravel"</span> <span class="attr">href</span>=<span class="string">"http://ct.ctrip.com"</span>></span>商旅</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span> <span class="attr">id</span>=<span class="string">"div_crptravel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"商旅首页"</span> <span class="attr">id</span>=<span class="string">"c_ph_slsy_s"</span> <span class="attr">href</span>=<span class="string">"http://ct.ctrip.com"</span>></span>商旅首页</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"企业差旅平台"</span> <span class="attr">id</span>=<span class="string">"c_ph_chl_s"</span> <span class="attr">href</span>=<span class="string">"http://ct.ctrip.com/crptravel/default/landing"</span>></span>企业差旅平台<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"label-en"</span>></span><span class="tag"><<span class="name">em</span>></span>HOT<span class="tag"></<span class="name">em</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"会议旅游"</span> <span class="attr">id</span>=<span class="string">"c_ph_hj_s"</span> <span class="attr">href</span>=<span class="string">"http://mice.ctrip.com"</span>></span>会议旅游</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider divider_spec"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_cruise"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"邮轮"</span> <span class="attr">class</span>=<span class="string">"cui_nav_non"</span> <span class="attr">id</span>=<span class="string">"c_ph_youlun"</span> <span class="attr">href</span>=<span class="string">"http://cruise.ctrip.com"</span>></span>邮轮<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider divider_spec"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_cruise_skysea"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"天海邮轮"</span> <span class="attr">class</span>=<span class="string">"cui_nav_non"</span> <span class="attr">id</span>=<span class="string">"c_ph_skysea"</span> <span class="attr">href</span>=<span class="string">"http://cruise.ctrip.com/skysea"</span>></span>天海邮轮<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"cui_nav_more"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">id</span>=<span class="string">"a_moreLink"</span> <span class="attr">titledec</span>=<span class="string">"更多"</span> <span class="attr">class</span>=<span class="string">"cui_nav_more cui_nav_has"</span> <span class="attr">href</span>=<span class="string">"http://jifen.ctrip.com/rewards"</span>></span>更多</span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"cui_ico_triangle"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"point"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"cui_subnav_wrap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_sub_nav"</span> <span class="attr">id</span>=<span class="string">"div_more"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"积分商城"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">id</span>=<span class="string">"c_ph_rewards_m"</span> <span class="attr">href</span>=<span class="string">"http://jifen.ctrip.com/rewards"</span>></span>积分商城</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">titledec</span>=<span class="string">"合作卡"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">id</span>=<span class="string">"c_ph_cards_m"</span> <span class="attr">href</span>=<span class="string">"http://cards.ctrip.com"</span>></span>合作卡</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">id</span>=<span class="string">"loginDivLi"</span> <span class="attr">class</span>=<span class="string">"cui_nav_myctrip cui_content"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_myctrip_log"</span> <span class="attr">style</span>=<span class="string">"display:block;"</span> <span class="attr">id</span>=<span class="string">"ulCTFullMC"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"userLogin"</span> <span class="attr">id</span>=<span class="string">"div_User"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"myctrip"</span> <span class="attr">style</span>=<span class="string">"margin-top:0;"</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">id</span>=<span class="string">"div_MyCtrip"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_account cui_account_login"</span> <span class="attr">id</span>=<span class="string">"loginDiv"</span> <span class="attr">style</span>=<span class="string">"display:none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"div_Loginbtn"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"cui_account_info"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/home/Order/AllOrder.aspx#ctm_ref=ssc_hp_myctrip_allorders_a"</span>></span>全部订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"account_order"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/FlightOrderList.aspx#ctm_ref=ssc_hp_myctrip_flightorders_a"</span>></span>机票订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/HotelOrderList.aspx#ctm_ref=ssc_hp_myctrip_hotelorders_a"</span>></span>酒店订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/PkgOrderList.aspx#ctm_ref=ssc_hp_myctrip_tourorders_a"</span>></span>旅游订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Order/RailwayOrderList.aspx#ctm_ref=ssc_hp_myctrip_trainorders_a"</span>></span>火车票订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">class</span>=<span class="string">"gray"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/home/FastOrder/OrderSearch.aspx#ctm_ref=ssc_hp_myctrip_phoneorders_a"</span>></span>手机号查订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"divider"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"https://secure.ctrip.com/Payment-Base-PaymentPwd/Wallet/View/MyWalletIndex.aspx#ctm_ref=ssc_hp_myctrip_wallet_a"</span>></span>携程钱包</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/FavoriteOnline/hotel/hotellist.aspx#ctm_ref=ssc_hp_myctrip_collect_a"</span>></span>收藏</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"https://smarket.ctrip.com/Promocode/zh-cn/Promocode.aspx#ctm_ref=ssc_hp_myctrip_integral_a"</span>></span>票券与积分</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/Home/Passenger/PassengerList.aspx#ctm_ref=ssc_hp_myctrip_info_a"</span>></span>常用信息</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"message"</span> <span class="attr">id</span>=<span class="string">"div_MyCTMessages"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_myctrip_log"</span> <span class="attr">style</span>=<span class="string">"display:none;"</span> <span class="attr">id</span>=<span class="string">"ulCTMinMC"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"userLogin"</span> <span class="attr">id</span>=<span class="string">"div_User"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"myctrip"</span> <span class="attr">style</span>=<span class="string">"margin-top:0;clear:left;"</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">id</span>=<span class="string">"div_MyCtrip"</span>></span><span class="tag"></<span class="name">span</span>></span><span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"cui_account cui_account_login"</span> <span class="attr">id</span>=<span class="string">"loginDiv"</span> <span class="attr">style</span>=<span class="string">"display:none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"div_Loginbtn"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"cui_account_info"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/home/Order/AllOrder.aspx#ctm_ref=ssc_hp_myctrip_allorders_a"</span>></span>全部订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">class</span>=<span class="string">"gray"</span> <span class="attr">href</span>=<span class="string">"http://my.ctrip.com/home/FastOrder/OrderSearch.aspx#ctm_ref=ssc_hp_myctrip_phoneorders_a"</span>></span>手机号查订单</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"message"</span> <span class="attr">id</span>=<span class="string">"div_MyCTMessages"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"nav_bh"</span> <span class="attr">class</span>=<span class="string">"cui_nav_behind"</span> <span class="attr">style</span>=<span class="string">"display:none;height:0px;"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"popfloating_isshow"</span> <span class="attr">value</span>=<span class="string">"0"</span>></span><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"siteDomainHeadFloat"</span> <span class="attr">value</span>=<span class="string">"ctrip"</span>></span><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"bsType"</span> <span class="attr">value</span>=<span class="string">"0"</span>></span><span class="tag"><<span class="name">script</span>></span><span class="undefined"></span><br><span class="line">/**</span><br><span class="line"> * Ctrip JavaScript Code</span><br><span class="line"> * http://www.ctrip.com/</span><br><span class="line"> * Copyright(C) 2008 - 2015, Ctrip All rights reserved.</span><br><span class="line"> * Version: 151217</span><br><span class="line"> * Date: 2015-12-17</span><br><span class="line"> */</span><br><span class="line">;window.replace=function(){return ''};window.replace=function(){return""};</span><br><span class="line">!function(){window.replace=function(){return""};(function(){var h=document,c=function(a){return h.getElementById(a)},k=null,l=null,m=0,d=[c("cui_nav_destination"),c("cui_nav_hotel"),c("cui_nav_vac"),c("cui_nav_flight"),c("cui_nav_more"),c("cui_nav_car"),c("cui_nav_trains"),c("cui_nav_tuan"),c("cui_nav_lpk"),c("cui_nav_ticket"),c("cui_nav_sl"),c("cui_nav_g")],g={onmouseenter:function(a,b){(h.all?a.onmouseenter=b:a.onmouseover=function(a){(null==a.relatedTarget?b():this!==a.relatedTarget&&20!=this.compareDocumentPosition(a.relatedTarget)&&</span><br><span class="line">b())})},onmouseout:function(a,b){(h.all?a.onmouseleave=b:a.onmouseout=function(a){(null==a.relatedTarget?b():this!==a.relatedTarget&&20!=this.compareDocumentPosition(a.relatedTarget)&&b())})},addEvent:function(a,b,f){(a.addEventListener?a.addEventListener(b,f,!1):(a.attachEvent?a.attachEvent("on"+b,f):a["on"+b]=f))}},e={setTime:function(){g.onmouseenter(c("cui_nav"),function(){setTimeout(function(){m=150},30)});g.onmouseout(c("cui_nav"),function(){m=0})},initEvent:function(){for(var a=0,b=d.length;b>a;a++)(function(){var b=</span><br><span class="line">a;g.onmouseenter(d[b],function(){e.interFn(d[b])});g.onmouseout(d[b],function(){e.outerFn(d[b])})})(a)},reset:function(){for(var a=0,b=d.length;b>a;a++)d[a].className=(-1<d[a].className.indexOf("cui_nav_current")?"cui_nav_current":"")},padReset:function(a){for(var b=0,f=d.length;f>b;b++)(-1<d[b].className.indexOf("cui_nav_current")?d[b].className="cui_nav_current":b!==a&&(d[b].className=""))},interFn:function(a){for(var b=document.getElementById("cui_nav").getElementsByTagName("li"),f="",d=0;d<b.length;d++)b[d].className.match((/cui_nav_current/))&&</span><br><span class="line">(f=b[d]);null!=l&&(clearTimeout(l),l=null);k=setTimeout(function(){e.reset();(-1<a.className.indexOf("cui_nav_current")?f.className="cui_nav_current":(a.className="cui_nav_o",f.className="cui_nav_current cui_nav_unhover"))},m)},outerFn:function(a){for(var b=document.getElementById("cui_nav").getElementsByTagName("li"),d="",c=0;c<b.length;c++)b[c].className.match((/cui_nav_current/))&&(d=b[c]);null!=k&&(clearTimeout(k),k=null);l=setTimeout(function(){e.reset();(-1<a.className.indexOf("cui_nav_current")?</span><br><span class="line">d.className="cui_nav_current":(a.className="",d.className="cui_nav_current"))},250)},initMobile:function(){for(var a=0,b=d.length;b>a;a++)(function(){var b=a,c=d[b].getElementsByTagName("A")[0];c.href="###";c.onmousedown=function(){e.padReset(b);-1===d[b].className.indexOf("cui_nav_current")&&((-1<d[b].className.indexOf("cui_nav_o")?(d[b].className="",document.getElementsByClassName("cui_nav_current")[0].className="cui_nav_current",c.style.visibility="hidden",setTimeout(function(){c.style.visibility=</span><br><span class="line">"visible"},10)):(d[b].className="cui_nav_o",document.getElementsByClassName("cui_nav_current")[0].className="cui_nav_current",document.getElementsByClassName("cui_nav_current")[0].className+=" cui_nav_unhover")))}})(a)},contains:function(a){for(var b=0,c=d.length;c>b;b++)if(0<d[b].compareDocumentPosition(a)-19)return!0;return!1}};c("headStyleId")&&c("headStyleId").parentNode.removeChild(c("headStyleId"));((/ip(hone|od)|ipad/i).test(navigator.userAgent)?(e.initMobile(),g.addEvent(h.body,"click",function(a){e.contains(a.target||</span><br><span class="line">a.srcElement)||e.reset()})):(e.setTime(),e.initEvent()))})()}();</span><br><span class="line"></span><br><span class="line"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"base_bd"</span>></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"head_crumb clearfix"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"search_flthotel"</span> <span class="attr">id</span>=<span class="string">"flthotelLink"</span> <span class="attr">onclick</span>=<span class="string">"AirHotel.redirectToPackageAction();"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span>></span>机+酒<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/"</span>></span>国内机票<span class="tag"></<span class="name">a</span>></span> &gt; 哈尔滨到上海机票(单程)</span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">id</span>=<span class="string">"reSearchForm"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"search_form"</span> <span class="attr">class</span>=<span class="string">"search_form clearfix"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"flight_way"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"FlightSearchType"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"S"</span>></span>单程<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"D"</span>></span>往返<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"M"</span>></span>联程<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"flight_attribute"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"multiway"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span>第一程:<span class="tag"></<span class="name">strong</span>></span> 出发城市 <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"DCityName1"</span> <span class="attr">name</span>=<span class="string">"DCityName1"</span> <span class="attr">mod</span>=<span class="string">"address|notice"</span> <span class="attr">mod_address_tpl</span>=<span class="string">"on"</span> <span class="attr">mod_address_reference</span>=<span class="string">"DCity1"</span> <span class="attr">placeholder</span>=<span class="string">"中文/拼音"</span> <span class="attr">mod_address_source</span>=<span class="string">"flight_new"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"swapcity ico_change2"</span> <span class="attr">title</span>=<span class="string">"互换出发到达城市"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"lblACity"</span>></span>到达城市<span class="tag"></<span class="name">span</span>></span> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"ACityName1"</span> <span class="attr">name</span>=<span class="string">"ACityName1"</span> <span class="attr">mod_address_reference</span>=<span class="string">"ACity1"</span> <span class="attr">mod_address_tpl</span>=<span class="string">"on"</span> <span class="attr">mod</span>=<span class="string">"address|notice"</span> <span class="attr">mod_address_source</span>=<span class="string">"flight_new"</span> <span class="attr">placeholder</span>=<span class="string">"中文/拼音"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span></span><br><span class="line"> 出发日期 <span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"DDate1"</span> <span class="attr">name</span>=<span class="string">"DDate1"</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">value</span>=<span class="string">""</span> <span class="attr">mod</span>=<span class="string">"calendar|notice"</span> <span class="attr">placeholder</span>=<span class="string">"yyyy-mm-dd"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"returndate"</span>></span>返回日期 <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"ReturnDate1"</span> <span class="attr">name</span>=<span class="string">"ReturnDate1"</span> <span class="attr">mod</span>=<span class="string">"calendar|notice"</span> <span class="attr">placeholder</span>=<span class="string">"yyyy-mm-dd"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"search_m second_line"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span>></span><span class="tag"><<span class="name">strong</span>></span>第二程:<span class="tag"></<span class="name">strong</span>></span> 中转城市 <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">disabled</span>=<span class="string">"disabled"</span> <span class="attr">id</span>=<span class="string">"DCityName2"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span><span class="tag"></<span class="name">span</span>></span> <span class="tag"><<span class="name">span</span>></span>到达城市 <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"ACityName2"</span> <span class="attr">name</span>=<span class="string">"ACityName2"</span> <span class="attr">mod_address_tpl</span>=<span class="string">"on"</span> <span class="attr">mod_address_focusnext</span>=<span class="string">"true"</span> <span class="attr">mod_address_reference</span>=<span class="string">"ACity2"</span> <span class="attr">mod</span>=<span class="string">"address|notice"</span> <span class="attr">mod_address_source</span>=<span class="string">"flight_new"</span> <span class="attr">placeholder</span>=<span class="string">"中文/拼音"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span><span class="tag"></<span class="name">span</span>></span> <span class="tag"><<span class="name">span</span>></span>出发日期 <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"DDate2"</span> <span class="attr">name</span>=<span class="string">"DDate2"</span> <span class="attr">mod</span>=<span class="string">"calendar|notice"</span> <span class="attr">placeholder</span>=<span class="string">"yyyy-mm-dd"</span> <span class="attr">autocomplete</span>=<span class="string">"off"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"type_number_line"</span> <span class="attr">id</span>=<span class="string">"advanceOption"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">style</span>=<span class="string">"padding-left: 24px; text-align: right;"</span>></span>人数<span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"PassengerQuantity"</span> <span class="attr">name</span>=<span class="string">"PassengerQuantity"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"1"</span> <span class="attr">selected</span>=<span class="string">"selected"</span>></span>1<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"2"</span>></span>2<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"3"</span>></span>3<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"4"</span>></span>4<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"5"</span>></span>5<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"6"</span>></span>6<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"7"</span>></span>7<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"8"</span>></span>8<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"9"</span>></span>9<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">id</span>=<span class="string">"passengerType_label"</span>></span>乘客类型<span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"PassengerType"</span> <span class="attr">name</span>=<span class="string">"PassengerType"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"ADU"</span> <span class="attr">selected</span>=<span class="string">"selected"</span>></span>成人<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"CHI"</span>></span>儿童(2-12周岁)<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"BAB"</span>></span>婴儿(2周岁以下)<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span>></span>舱位等级<span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"ClassType"</span> <span class="attr">name</span>=<span class="string">"ClassType"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">""</span>></span>经济舱<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">option</span> <span class="attr">value</span>=<span class="string">"CF"</span>></span>公务舱/头等舱<span class="tag"></<span class="name">option</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"search_tools clearfix"</span> <span class="attr">id</span>=<span class="string">"searchBtns"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"button"</span> <span class="attr">data-ubt</span>=<span class="string">"ReSearch"</span> <span class="attr">value</span>=<span class="string">"重新搜索"</span> <span class="attr">style</span>=<span class="string">"display:"</span> <span class="attr">class</span>=<span class="string">"btn_search"</span> <span class="attr">id</span>=<span class="string">"btnReSearch"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">data-ubt</span>=<span class="string">"AdvanceSearch"</span> <span class="attr">id</span>=<span class="string">"advancedSearch"</span> <span class="attr">style</span>=<span class="string">"display:"</span> <span class="attr">class</span>=<span class="string">"arrow_down"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span>></span>高级搜索<span class="tag"><<span class="name">b</span>></span><span class="tag"></<span class="name">b</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"DCity1"</span> <span class="attr">name</span>=<span class="string">"DCity1"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"ACity1"</span> <span class="attr">name</span>=<span class="string">"ACity1"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"DCity2"</span> <span class="attr">name</span>=<span class="string">"DCity2"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"ACity2"</span> <span class="attr">name</span>=<span class="string">"ACity2"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"searchHistory_box"</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"base_main"</span> <span class="attr">id</span>=<span class="string">"baseMain"</span>></span> </span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_ADBanner"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_Announcement"</span> <span class="attr">style</span>=<span class="string">"display:none"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_filterAlert"</span> <span class="attr">style</span>=<span class="string">"display:none"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_alertInfo"</span> <span class="attr">style</span>=<span class="string">"display:none"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"searchLoading"</span> <span class="attr">style</span>=<span class="string">"height: 160px; text-align: center;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"color: #333; padding: 5px 0;"</span>></span>正在为您搜索航班信息...<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"ico_loading"</span>></span><span class="tag"></<span class="name">i</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"color: #999; padding: 5px 0;"</span>></span>携程在手,说走就走<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_searchError"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_selectedFlight"</span> <span class="attr">style</span>=<span class="string">"display:none"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">style</span>=<span class="string">"display: none"</span> <span class="attr">id</span>=<span class="string">"jmp_table2"</span>></span></span><br><span class="line"> ${txt1}</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_searchPannel"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"searchresult_content choose_type_m"</span> <span class="attr">id</span>=<span class="string">"J_searchResultList"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_controlPannel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"calendar_tab calendar_panel clearfix"</span> <span class="attr">style</span>=<span class="string">"overflow: hidden;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"prevDate"</span> <span class="attr">class</span>=<span class="string">"prev_date"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"arrow_left_disable"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">data-ubt</span>=<span class="string">"ChangeDate_Left"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span>></span><span class="tag"><<span class="name">b</span>></span><span class="tag"></<span class="name">b</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">style</span>=<span class="string">"position: relative;"</span> <span class="attr">class</span>=<span class="string">"calendar_tab_list"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">id</span>=<span class="string">"J_lowestPriceDateList"</span> <span class="attr">class</span>=<span class="string">"calendar_ul clearfix"</span> <span class="attr">style</span>=<span class="string">"position: relative;</span><br><span class="line"> left: 0;"</span>></span><span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"nextDate"</span> <span class="attr">class</span>=<span class="string">"next_date"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"arrow_right"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">data-ubt</span>=<span class="string">"ChangeDate_Right"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0)"</span>></span><span class="tag"><<span class="name">b</span>></span><span class="tag"></<span class="name">b</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"panel_link"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"lowestPriceLink"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span> <span class="attr">class</span>=<span class="string">"days90"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"search_filter clearfix"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_flightFilter"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">style</span>=<span class="string">'display: none;'</span> <span class="attr">id</span>=<span class="string">"J_filterBar"</span> <span class="attr">class</span>=<span class="string">"filter_choosen clearfix"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h4</span>></span></span><br><span class="line"> 筛选条件:</span><br><span class="line"> <span class="tag"></<span class="name">h4</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span> <span class="attr">data-ubt</span>=<span class="string">"Filter_Delete"</span> <span class="attr">id</span>=<span class="string">'filterClear'</span>></span>清除<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"sort-controls clearfix"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"sorts"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"default_sort"</span> <span class="attr">data-ubt</span>=<span class="string">"Sort_All"</span> <span class="attr">ascdesc</span>=<span class="string">"综合"</span> <span class="attr">descdesc</span>=<span class="string">"综合"</span> <span class="attr">original</span>=<span class="string">"综合"</span> <span class="attr">field</span>=<span class="string">"default"</span> <span class="attr">cmd</span>=<span class="string">"sort"</span> <span class="attr">sort</span>=<span class="string">"ASC"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span> <span class="attr">class</span>=<span class="string">"default"</span>></span>综合<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">class</span>=<span class="string">"current"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"dtime_sort"</span> <span class="attr">data-ubt</span>=<span class="string">"Sort_DepartTime"</span> <span class="attr">ascdesc</span>=<span class="string">"起飞时间从早到晚"</span> <span class="attr">descdesc</span>=<span class="string">"起飞时间从晚到早"</span> <span class="attr">original</span>=<span class="string">"起飞时间"</span></span><br><span class="line"> <span class="attr">field</span>=<span class="string">"dtime"</span> <span class="attr">cmd</span>=<span class="string">"sort"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span> <span class="attr">sort</span>=<span class="string">"ASC"</span>></span>起飞时间从早到晚<span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"ico ico-sort"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">id</span>=<span class="string">"price_sort"</span> <span class="attr">data-ubt</span>=<span class="string">"Sort_Price"</span> <span class="attr">ascdesc</span>=<span class="string">"价格从低到高"</span> <span class="attr">descdesc</span>=<span class="string">"价格从高到低"</span> <span class="attr">original</span>=<span class="string">"价格"</span> <span class="attr">field</span>=<span class="string">"price"</span></span><br><span class="line"> <span class="attr">cmd</span>=<span class="string">"sort"</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span>></span>价格<span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"ico"</span>></span><span class="tag"></<span class="name">i</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"javascript:void(0);"</span> <span class="attr">data-ubt</span>=<span class="string">"OnTimeRate"</span> <span class="attr">descdesc</span>=<span class="string">"准点率从高到低"</span> <span class="attr">original</span>=<span class="string">"准点率"</span> <span class="attr">field</span>=<span class="string">"punctuality"</span></span><br><span class="line"> <span class="attr">cmd</span>=<span class="string">"sort"</span>></span>准点率<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"javascript:;"</span> <span class="attr">data-ubt</span>=<span class="string">"Governer"</span> <span class="attr">class</span>=<span class="string">"government-btn"</span> <span class="attr">onclick</span>=<span class="string">"Ctrip.Flight.Moudule.Other.civilSearch()"</span>></span>公务员通道<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h3</span>></span></span><br><span class="line"> 共<span class="tag"><<span class="name">strong</span> <span class="attr">id</span>=<span class="string">"flightCount"</span>></span>0<span class="tag"></<span class="name">strong</span>></span>条航班信息</span><br><span class="line"> <span class="tag"></<span class="name">h3</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"filter_side filter_mileage"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">label</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"checkbox"</span> <span class="attr">data-ubt</span>=<span class="string">"Mile"</span> <span class="attr">id</span>=<span class="string">"filterMileage"</span> <span class="attr">class</span>=<span class="string">"input_checkbox"</span> /></span>显示里程累积</span><br><span class="line"> <span class="tag"></<span class="name">label</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"flight-list-content"</span> <span class="attr">style</span>=<span class="string">"position: relative; z-index: 1"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_flightlist1"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_flightlist2"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"flightTransitRound"</span> <span class="attr">class</span>=<span class="string">"recommend_transit_box"</span> <span class="attr">style</span>=<span class="string">"display: none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h3</span> <span class="attr">class</span>=<span class="string">"recommend_transit_hd"</span>></span></span><br><span class="line"> 往返中转推荐<span class="tag"></<span class="name">h3</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"jmp_text"</span> <span class="attr">style</span>=<span class="string">"display: none"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"jmp_bd"</span>></span></span><br><span class="line"> ${txt0}<span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"jmp_text_nopadding"</span> <span class="attr">style</span>=<span class="string">"display: none"</span>></span></span><br><span class="line"> ${txt0}</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"recommendProducts"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_transit"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_specialOffer"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_near"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"recommend_box"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h3</span>></span>有低价早知道<span class="tag"></<span class="name">h3</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"lowcost_remind"</span>></span>价格还不够低?订阅低价提醒,率先掌握低价信息。<span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"btn_remind"</span> <span class="attr">data-ubt</span>=<span class="string">"LowestSubscribe"</span> <span class="attr">onclick</span>=<span class="string">"window.open($(this).attr('url'))"</span> <span class="attr">type</span>=<span class="string">"button"</span> <span class="attr">value</span>=<span class="string">"立刻订阅"</span> <span class="attr">class</span>=<span class="string">"btn_white"</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"disclaimer"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h3</span>></span>航班信息免责声明:<span class="tag"></<span class="name">h3</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span>携程旅行网提供的各类航班相关的信息,包括但不限于舱位价格、餐食、起降准点率等,来源于中国航信、全国各大机场、航空公司及相关部门公布数据。由于这些信息可能随时变化,以及网络传输问题,携程提供的此类信息可能并非最新或存在误差,因此<span class="tag"><<span class="name">b</span>></span>仅供旅客作为一般参考<span class="tag"></<span class="name">b</span>></span>,任何公司或个人不能将此作为携程做出任何承诺或做出任何保证的依据。<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"base_crumb"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com"</span>></span>国内机票查询<span class="tag"></<span class="name">a</span>></span>&nbsp;| <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/hrb-HAERBIN-flights.html"</span>></span>哈尔滨<span class="tag"></<span class="name">a</span>></span>&nbsp;| <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/HRB-SHA-day-1.html"</span>></span>哈尔滨到上海<span class="tag"></<span class="name">a</span>></span>&nbsp;|</span><br><span class="line"> <span class="tag"><<span class="name">span</span>></span>哈尔滨到上海5月13日<span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"data_travelsky"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span>></span><span class="tag"></<span class="name">span</span>></span>数据信息由<span class="tag"><<span class="name">br</span> /></span></span><br><span class="line"> 中国民航信息网络股份有限公司提供</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"noresult_seo"</span> <span class="attr">style</span>=<span class="string">"display:none;"</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"none_seo"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"title"</span>></span></span><br><span class="line"> 国内热门机票<span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"link"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/CTU-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"成都到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>成都到上海机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/BJS-CTU-day-1.html"</span> <span class="attr">title</span>=<span class="string">"北京到成都机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>北京到成都机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/BJS-SZX-day-1.html"</span> <span class="attr">title</span>=<span class="string">"北京到深圳机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>北京到深圳机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/CTU-BJS-day-1.html"</span> <span class="attr">title</span>=<span class="string">"成都到北京机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>成都到北京机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/CAN-BJS-day-1.html"</span> <span class="attr">title</span>=<span class="string">"广州到北京机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>广州到北京机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/TAO-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"青岛到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>青岛到上海机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/XMN-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"厦门到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>厦门到上海机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/SIA-BJS-day-1.html"</span> <span class="attr">title</span>=<span class="string">"西安到北京机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>西安到北京机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/CAN-HGH-day-1.html"</span> <span class="attr">title</span>=<span class="string">"广州到杭州机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>广州到杭州机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/CKG-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"重庆到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>重庆到上海机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/SIA-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"西安到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>西安到上海机票<span class="tag"></<span class="name">a</span>></span> </span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/TSN-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"天津到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>天津到上海机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/BJS-KMG-day-1.html"</span> <span class="attr">title</span>=<span class="string">"北京到昆明机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>北京到昆明机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/HET-BJS-day-1.html"</span> <span class="attr">title</span>=<span class="string">"呼和浩特到北京机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>呼和浩特到北京机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/SHA-KHN-day-1.html"</span> <span class="attr">title</span>=<span class="string">"上海到南昌机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>上海到南昌机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/HFE-CAN-day-1.html"</span> <span class="attr">title</span>=<span class="string">"合肥到广州机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>合肥到广州机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/NKG-CAN-day-1.html"</span> <span class="attr">title</span>=<span class="string">"南京到广州机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>南京到广州机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/ZUH-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"珠海到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>珠海到上海机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/SYX-SHA-day-1.html"</span> <span class="attr">title</span>=<span class="string">"三亚到上海机票"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>三亚到上海机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"base_side rightcolumn"</span> <span class="attr">id</span>=<span class="string">"demo_side"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_roundLowestPrice"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_searchHistory"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mb10"</span> <span class="attr">style</span>=<span class="string">"display:none"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://events.ctrip.com/flight/jiesongjihuodongpc.html#ctm_ref=Fld_sr_rec_carcoup"</span> <span class="attr">class</span>=<span class="string">"send_hotel_coupon"</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_airlineLowestPrice"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_rcmAirlineLowestPrice"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"J_NearFlightRecommend"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mod_box mb10"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"btn-block moment_icon1"</span> <span class="attr">data-ubt</span>=<span class="string">"FlightCalendar"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/schedule/HRB.SHA.html#ctm_ref=fld_sr_fsch_def_i_1"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">i</span>></span><span class="tag"></<span class="name">i</span>></span>航班时刻表<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mod_box mb10"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"btn-block information_icon1"</span> <span class="attr">data-ubt</span>=<span class="string">"FlightInfo"</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime/HRB-SHA#ctm_ref=fld_sr_ftl_def_i_1"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">i</span>></span><span class="tag"></<span class="name">i</span>></span>航班动态查询<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"whyctrip2"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h3</span>></span>为什么选携程?<span class="tag"></<span class="name">h3</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"whyctrip2_main"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/commerce/promote/201410/flight/jp/index.html#fld_sr_slg_def_t_1"</span> <span class="attr">data-ubt</span>=<span class="string">"SafeService"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">img</span> <span class="attr">data-ubt</span>=<span class="string">"SafeService"</span> <span class="attr">src</span>=<span class="string">"http://pic.c-ctrip.com/fltdomestic111027/choose_search.png"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"seo_footer_new"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"title"</span>></span></span><br><span class="line"> 携程网提供<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/"</span>></span>特价机票<span class="tag"></<span class="name">a</span>></span>,<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/schedule/"</span>></span>航班时刻表<span class="tag"></<span class="name">a</span>></span>,<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime/"</span>></span>航班动态查询<span class="tag"></<span class="name">a</span>></span>:</span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"p_text"</span>></span>携程机票为您提供<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/lowprice-HRB-SHA----adu-1/"</span>></span>哈尔滨到上海特价机票<span class="tag"></<span class="name">a</span>></span>,以及<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/china-city-flights-sitemap.html"</span>></span>飞机票价格查询<span class="tag"></<span class="name">a</span>></span>,<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/top"</span>></span>机票排行榜<span class="tag"></<span class="name">a</span>></span>,<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/hot-flights.html"</span>></span>热门机票<span class="tag"></<span class="name">a</span>></span>,<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/hot-airport.html"</span>></span>机场查询<span class="tag"></<span class="name">a</span>></span>.现在<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"https://accounts.ctrip.com/member/emailregist.aspx"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span>注册<span class="tag"></<span class="name">a</span>></span>携程会员即可获得1200积分和1300元消费券! <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">strong</span>></span>哈尔滨到上海相关<span class="tag"></<span class="name">strong</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/HRB-SHA-day-1.html"</span>></span>哈尔滨到上海机票<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/schedule/HRB.SHA.html"</span>></span>哈尔滨到上海航班<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime/HRB-SHA/"</span>></span>哈尔滨到上海航班动态<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/SHA-HRB-day-1.html"</span>></span>上海到哈尔滨机票<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://m.ctrip.com/html5/flight/HRB-SHA-day-1.html"</span>></span>哈尔滨到上海机票手机版<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">strong</span>></span>旅行助手<span class="tag"></<span class="name">strong</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/hrb-haerbin-flights.html"</span>></span>哈尔滨特价机票<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/schedule/hrb..html"</span>></span>哈尔滨航班时刻表<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime/depart-hrb/"</span>></span>哈尔滨航班动态<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/airport-taiping/"</span>></span>太平国际机场<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime/booking/top/city-hrb"</span>></span>哈尔滨机票排行榜<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://trains.ctrip.com/TrainBooking/haerbin/"</span>></span>哈尔滨火车票<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://trains.ctrip.com/TrainSchedule/haerbin/"</span>></span>哈尔滨火车时刻表<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/hotel/haerbin5"</span>></span>哈尔滨酒店预订<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">strong</span>></span>机票工具箱<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/china-city-flights-sitemap.html"</span> <span class="attr">title</span>=<span class="string">"打折机票"</span>></span>打折机票<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/schedule/"</span> <span class="attr">title</span>=<span class="string">"航班查询时刻表"</span>></span>航班时刻表查询<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/actualtime/"</span> <span class="attr">title</span>=<span class="string">"航班实时起降查询"</span>></span>航班动态查询<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/hot-airport.html"</span> <span class="attr">title</span>=<span class="string">"热门机场"</span>></span>机场查询<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/top"</span> <span class="attr">title</span>=<span class="string">"机票排行榜"</span>></span>机票排行榜<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/hot-city-flights-sitemap.html"</span> <span class="attr">title</span>=<span class="string">"机票地图"</span>></span>机票地图<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://m.ctrip.com/html5/Flight/"</span> <span class="attr">title</span>=<span class="string">"机票手机版"</span>></span>机票手机版<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.skysea.com/"</span> <span class="attr">title</span>=<span class="string">"天海游轮"</span>></span>天海游轮<span class="tag"></<span class="name">a</span>></span> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/domestic/checkinseat/index"</span> <span class="attr">title</span>=<span class="string">"值机"</span>></span>值机<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">strong</span>></span>打折机票<span class="tag"></<span class="name">strong</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/sha-Shanghai-flights.html"</span>></span>上海特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/bjs-Beijing-flights.html"</span>></span>北京特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/can-Guangzhou-flights.html"</span>></span>广州特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/szx-Shenzhen-flights.html"</span>></span>深圳特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/ckg-Chongqing-flights.html"</span>></span>重庆特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/ctu-Chengdu-flights.html"</span>></span>成都特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/kmg-Kunming-flights.html"</span>></span>昆明特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/xmn-Xiamen-flights.html"</span>></span>厦门特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/syx-Sanya-flights.html"</span>></span> 三亚特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/dlc-Dalian-flights.html"</span>></span> 大连特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/ljg-Lijiang-flights.html"</span>></span>丽江特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/tsn-Tianjin-flights.html"</span>></span>天津特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/foc-Fuzhou-flights.html"</span>></span>福州特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/she-Shenyang-flights.html"</span>></span>沈阳特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/cgo-Zhengzhou-flights.html"</span>></span> 郑州特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/tao-Qingdao-flights.html"</span>></span>青岛特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/sia-Xian-flights.html"</span>></span>西安特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/nkg-Nanjing-flights.html"</span>></span>南京特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/wuh-Wuhan-flights.html"</span>></span>武汉特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/hgh-Hangzhou-flights.html"</span>></span>杭州特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/china-city-flights-sitemap.html"</span>></span>更多特价机票<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"ApplyProductWaitTimeTips"</span> <span class="attr">class</span>=<span class="string">"pop_v2_bd"</span> <span class="attr">style</span>=<span class="string">"display:none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"padding: 10px 20px; text-align: center;"</span>></span>该机票我愿意从<span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>05月11日<span class="tag"></<span class="name">span</span>></span>等到:<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"padding: 10px 20px; text-align: center;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">label</span> <span class="attr">class</span>=<span class="string">"base_label"</span> <span class="attr">id</span>=<span class="string">"apChoose24"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"radio"</span> <span class="attr">name</span>=<span class="string">"ApplyProductChoose"</span> <span class="attr">value</span>=<span class="string">"24"</span> <span class="attr">class</span>=<span class="string">"input_radio"</span> /></span></span><br><span class="line"> 24小时内</span><br><span class="line"> <span class="tag"></<span class="name">label</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">label</span> <span class="attr">class</span>=<span class="string">"base_label"</span> <span class="attr">id</span>=<span class="string">"apChoose72"</span> <span class="attr">style</span>=<span class="string">"margin-right: 10px;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"radio"</span> <span class="attr">name</span>=<span class="string">"ApplyProductChoose"</span> <span class="attr">value</span>=<span class="string">"72"</span> <span class="attr">class</span>=<span class="string">"input_radio"</span> /></span></span><br><span class="line"> 72小时内</span><br><span class="line"> <span class="tag"></<span class="name">label</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">label</span> <span class="attr">class</span>=<span class="string">"base_label"</span> <span class="attr">id</span>=<span class="string">"apChooseAll"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"radio"</span> <span class="attr">name</span>=<span class="string">"ApplyProductChoose"</span> <span class="attr">value</span>=<span class="string">"0"</span> <span class="attr">class</span>=<span class="string">"input_radio"</span> /></span></span><br><span class="line"> 起飞前2小时<span class="tag"></<span class="name">label</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">style</span>=<span class="string">"padding: 10px; text-align: center;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"button"</span> <span class="attr">value</span>=<span class="string">"申 请"</span> <span class="attr">class</span>=<span class="string">"base_btns2"</span> <span class="attr">id</span>=<span class="string">"ApplyProductBtn"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"PackageItems1"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">""</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"SmCorpFeeType1"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">""</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"SmCorpData1"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">""</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"SmCorpData"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">id</span>=<span class="string">"ab_testing_tracker"</span> <span class="attr">value</span>=<span class="string">"M:83,150323_fld_hltcp:E;M:58,160223_fld_bs3x:C;M:23,160303_fld_hscp:B;M:32,160225_fld_tsrec:B;M:58,160304_fld_pcbs:A;M:20,160316_fld_close:C;M:32,160225_fld_tsrec:B;"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"page_id"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"wait"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"RouteLowestPriceList"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">''</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"RouteLowestPriceListSecond"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"ubtLog1"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">""</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"commonKeyForUbt"</span> <span class="attr">name</span>=<span class="string">"flt_inland_search_click"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"flt_inland_search_click"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">input</span> <span class="attr">id</span>=<span class="string">"isSingleToRound"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">""</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="undefined"></span><br><span class="line"> var $$ = {module: { jmpInfo: { array: {} } } }; </span><br><span class="line"> var RootUrl="http://flights.ctrip.com/domestic/";</span><br><span class="line"> var SEORootUrl="http://flights.ctrip.com/booking/";</span><br><span class="line"> var BookRootUrl="http://flights.ctrip.com/Book/";</span><br><span class="line"> var SearchRootUrl = "http://flights.ctrip.com/domesticsearch/search/";</span><br><span class="line"> var ProcessRootUrl = 'http://flights.ctrip.com/Process';</span><br><span class="line"> var IsQuickBooking="";</span><br><span class="line"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"comfortable_jmp_text"</span> <span class="attr">style</span>=<span class="string">"display: none"</span>></span> </span><br><span class="line"> ${txt0}</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="xml"></span><br><span class="line"> window.ReleaseNo = "CR_2016_05_10_19_57_18";</span><br><span class="line"></span><br><span class="line"> window.onresize=window.onload = function () {</span><br><span class="line"> setFullScreen();</span><br><span class="line"> }</span><br><span class="line"> var pageWidth;</span><br><span class="line"></span><br><span class="line"> function setFullScreen() {</span><br><span class="line"> pageWidth = window.innerWidth;</span><br><span class="line"> if (typeof pageWidth != "number") {</span><br><span class="line"> if (document.compatMode == "CSS1Compat") {</span><br><span class="line"> pageWidth = document.documentElement.clientWidth;</span><br><span class="line"> } else {</span><br><span class="line"> pageWidth = document.body.clientWidth;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> var body = document.getElementsByTagName("body")[0];</span><br><span class="line"> if (pageWidth <span class="tag"><<span class="name">=</span> <span class="attr">1250</span>) {</span><br><span class="line"> <span class="attr">if</span> (/<span class="attr">msie</span>/<span class="attr">i.test</span>(<span class="attr">navigator.userAgent</span>)&&<span class="attr">body.className.indexOf</span>("<span class="attr">width_change</span>") == <span class="string">-1)</span> {</span><br><span class="line"> <span class="attr">body.className</span> = <span class="string">"width_change"</span>;</span><br><span class="line"> }</span><br><span class="line"> //<span class="attr">X</span>档案前</span><br><span class="line"> <span class="attr">if</span> (<span class="attr">document.getElementById</span>("<span class="attr">cui_nav_ul</span>")) {</span><br><span class="line"> <span class="attr">document.getElementById</span>("<span class="attr">cui_nav_ul</span>")<span class="attr">.style.width</span> = <span class="string">"980px"</span>;</span><br><span class="line"> <span class="attr">document.getElementById</span>("<span class="attr">cui_hd</span>")<span class="attr">.style.width</span> = <span class="string">"980px"</span>;</span><br><span class="line"> }</span><br><span class="line"> //<span class="attr">X</span>档案后</span><br><span class="line"> //低价日历的宽度</span><br><span class="line"> <span class="attr">var</span> <span class="attr">lowestPrice</span> = <span class="string">document.getElementById(</span>"<span class="attr">J_lowestPriceDateList</span>");</span><br><span class="line"> <span class="attr">if</span> (<span class="attr">lowestPrice</span> != <span class="string">null)</span> {</span><br><span class="line"> <span class="attr">var</span> <span class="attr">par</span> = <span class="string">lowestPrice.parentNode;</span></span><br><span class="line"> <span class="attr">while</span> (<span class="attr">par.nodeType</span> != <span class="string">1)</span> {</span><br><span class="line"> <span class="attr">par</span> = <span class="string">par.parentNode;</span></span><br><span class="line"> }</span><br><span class="line"> <span class="attr">par.style.width</span> = <span class="string">"748px"</span>;</span><br><span class="line"> <span class="attr">if</span> (<span class="attr">window</span>["<span class="attr">moudule_init</span>"]) {</span><br><span class="line"> <span class="attr">Ctrip.Flight.Moudule.PriceCalendar.resetPosition</span>();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //历史查询</span><br><span class="line"> <span class="attr">var</span> <span class="attr">searchHistory</span> = <span class="string">document.getElementById(</span>"<span class="attr">searchHistory</span>");</span><br><span class="line"> <span class="attr">if</span> (<span class="attr">searchHistory</span> != <span class="string">null</span> && <span class="attr">document.getElementById</span>("<span class="attr">searchHistory_box</span>")!=<span class="string">null)</span> {</span><br><span class="line"> <span class="attr">document.getElementById</span>("<span class="attr">searchHistory_box</span>")<span class="attr">.appendChild</span>(<span class="attr">searchHistory</span>);</span><br><span class="line"> }</span><br><span class="line"> //相邻航线特惠 <span class="attr">J_specialOffer</span></span><br><span class="line"> <span class="attr">var</span> <span class="attr">nearFlightRecommend</span> = <span class="string">document.getElementById(</span>"<span class="attr">NearFlightRecommend</span>");</span><br><span class="line"> <span class="attr">if</span> (<span class="attr">nearFlightRecommend</span> != <span class="string">null</span> && <span class="attr">document.getElementById</span>("<span class="attr">J_specialOffer</span>")!=<span class="string">null)</span> {</span><br><span class="line"> <span class="attr">document.getElementById</span>("<span class="attr">J_specialOffer</span>")<span class="attr">.appendChild</span>(<span class="attr">nearFlightRecommend</span>);</span><br><span class="line"> } </span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="attr">else</span> {</span><br><span class="line"> <span class="attr">if</span> (/<span class="attr">msie</span>/<span class="attr">i.test</span>(<span class="attr">navigator.userAgent</span>)&&<span class="attr">body.className.indexOf</span>("<span class="attr">width_change</span>") ></span> -1) {</span><br><span class="line"> body.className = "";</span><br><span class="line"> }</span><br><span class="line"> //X档案前</span><br><span class="line"> if (document.getElementById("cui_nav_ul")) {</span><br><span class="line"> document.getElementById("cui_nav_ul").style.width = "1180px";</span><br><span class="line"> document.getElementById("cui_hd").style.width = "1180px";</span><br><span class="line"> }</span><br><span class="line"> //X档案后</span><br><span class="line"> //低价日历</span><br><span class="line"> var lowestPrice = document.getElementById("J_lowestPriceDateList");</span><br><span class="line"> if (lowestPrice != null) {</span><br><span class="line"> var par = lowestPrice.parentNode;</span><br><span class="line"> while (par.nodeType != 1) {</span><br><span class="line"> par = par.parentNode;</span><br><span class="line"> }</span><br><span class="line"> par.style.width = "728px";</span><br><span class="line"> if (window["moudule_init"]) {</span><br><span class="line"> Ctrip.Flight.Moudule.PriceCalendar.resetPosition();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> //历史查询searchHistory</span><br><span class="line"> var searchHistory = document.getElementById("searchHistory");</span><br><span class="line"> if (searchHistory != null && document.getElementById("J_searchHistory")!=null) {</span><br><span class="line"> document.getElementById("J_searchHistory").appendChild(searchHistory);</span><br><span class="line"> }</span><br><span class="line"> //相邻航线特惠 </span><br><span class="line"> var nearFlightRecommend=document.getElementById("NearFlightRecommend");</span><br><span class="line"> if (nearFlightRecommend != null && document.getElementById("J_NearFlightRecommend")!=null) {</span><br><span class="line"> document.getElementById("J_NearFlightRecommend").appendChild(nearFlightRecommend);</span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"http://webresource.c-ctrip.com/code/cquery/LABjs/LAB.js"</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="xml"></span><br><span class="line"> var SearchCondition={"SearchType":"S","SearchRouteIndex":0,"DCity1":"HRB","DCityId1":5,"ACityId1":2,"ACityId2":0,"DCityName1":"哈尔滨","DPort1":"","ACity1":"SHA","ACityName1":"上海","APort1":"","ACity2":"","ACityName2":"","APort2":"","DDate1":"2016-05-13","DDate2":"","Quantity":1,"ClassType":"","PassengerType":"ADU","AirlineCode":"","AirlineName":"","DTimeRange":"","VipGrade":0,"DontDownloadData":false,"IsCivil":false,"DirectChannel":null,"IsSortByPrice":false,"CPCityId":5,"CK":"36B05DD175F36398546F66CA5EFD07DE","SaleChannel":"FlightOnline","IsShowOneNoCarAd":false,"HotelsCouponAbtestVersionInsuranceId":"C2C30","FlightXAdditionalProductsFlag":0,"IsRoundTrip":false,"IsNearAirportRecommond":"0","LogToken":"bab2b06f320f42898800a2cbf778a17a","ABTestInfo":[{"TestCode":"160304_fld_pcbs","TestVersion":"D"},{"TestCode":"160225_fld_tsrec","TestVersion":"B"}]};</span><br><span class="line"> var SelectedFlight1=null;</span><br><span class="line"> var pageConfig={</span><br><span class="line"> needSearch:true,</span><br><span class="line"> displayMode:0,</span><br><span class="line"> isRecommendTransit:true,</span><br><span class="line"> isOpenPOIAddress:true,</span><br><span class="line"> flightTemplate:[{"Key":"Icon_3USalePromotion","Content":"川航特卖季:订直销,享特价","ABTest":""},{"Key":"Icon_3USalePromotionType","Content":"特卖","ABTest":""}],</span><br><span class="line"> MD5UserID:"",</span><br><span class="line"> isOpenSearchRoundRecommend:true,</span><br><span class="line"> isSeparateShowRecommend:false ,</span><br><span class="line"> IsPromotionInfo: false,</span><br><span class="line"> isCivil:"",</span><br><span class="line"> isAirTrain:false,</span><br><span class="line"> isPreferetial:false,</span><br><span class="line"> vehicleType:"",</span><br><span class="line"> autosearchflightminute:10,</span><br><span class="line"> handlerIndex:"86,13-14,02-04-03",</span><br><span class="line"> airTrainDisplayMode:"1",</span><br><span class="line"> IsShowCoupon: true,</span><br><span class="line"> IsSearchRoundLowestPriceMore:true,</span><br><span class="line"> reTransitCount:5,</span><br><span class="line"> from:"",</span><br><span class="line"> isOpenFreeTravel:"T",</span><br><span class="line"> isOpenClassYPriceMarkup:"T",</span><br><span class="line"> IsShowMileage:"True",</span><br><span class="line"> TgqDetailAirlines:"CA,MU,FM,CZ,HU,SC",</span><br><span class="line"> ShowTgqDetailSubClass:"CA,MU,FM,CZ,HU,SC",</span><br><span class="line"> IsOpenTravelPrompt:"T",</span><br><span class="line"> TravelPromptType:"T",</span><br><span class="line"> TravelPromptMs:70,</span><br><span class="line"> AirLineConfig:"CA,MU,CZ,SC,JD,MF,FM,PN,AQ,KY,8L,GX,ZH,HO,QW,HU,GJ,FU,DZ,GS,3U,Y8,CN",</span><br><span class="line"> IsShowApplyTicketSuccessRate:true,</span><br><span class="line"> IsOpenRoundTripSpecial: true,</span><br><span class="line"> IsOpenRoundTripMultiReturn: true,</span><br><span class="line"> IsShowComfortable:false,</span><br><span class="line"> DirectSpread:0,</span><br><span class="line"> IsOpenDirectSpread:"T",</span><br><span class="line"> ApplyTicketMinSuccessRate:0.98,</span><br><span class="line"> HotelsCoupon:{HotelsCoupon:0,Insurance:1,HoteCoupon:2,HotelsCouponConfig:{n:"酒店优惠券",num:1,t:"HotelsCoupon",description:"<span class="tag"><<span class="name">h5</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">h5</span>></span><span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">\</span>"<span class="attr">decimal</span>\"></span><span class="tag"><<span class="name">li</span>></span>包含1张100元酒店优惠券<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>适用于单价大于300元的国内酒店房型(含港澳台)<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>100元现金将在酒店订单成交后3个工作日内返还至您的携程账户<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>优惠券自发放之日起30天内有效<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>具体使用规则详见我携优惠券使用说明<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>",originalPrice:100,p:25}},</span><br><span class="line"> VipGrade: "0|",</span><br><span class="line"> OrientThrow: true,</span><br><span class="line"> isFull:"",</span><br><span class="line"> RoundTripFlightLine:'',</span><br><span class="line"> RoundTripFlightNo:'',</span><br><span class="line"> RoundTripPrice:0,</span><br><span class="line"> TravelPackageAndRentCarHoverMessage:"适用产品:1)预订频道:携程用车-国内接送机频道;2)适用产品:产品左上角带有“专享”标签的国内接送机产品;3)使用限制:用车时间不限,支持网站及手机预订使用,每张订单优惠{{printprice}}元,优惠券自发券日起90天内预订使用有效;|||",</span><br><span class="line"> IsShowComfortableMessage:false,</span><br><span class="line"> DefaultSortSwitcher:true,</span><br><span class="line"> IpCityCheckSwitcher:false,</span><br><span class="line"> IpCityCheckTimeRange:"07:00-22:30",</span><br><span class="line"> ReroundExceptAirlines:"CZ",</span><br><span class="line"> ShowPackageShopExceptAirlines:"CZ",</span><br><span class="line"> GiftActivitiesRoutePopupMessage:'',</span><br><span class="line"> HideTicketMinSuccessRate:0.5,</span><br><span class="line"> ReplaceAirLineMarketingInsurance:'<span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">"decimal"</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>保险名称:中航三星航意险30<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>份数限制:购买上限5份;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>保险有效期:指被保险人每次以乘客身份,乘坐电子保单载明的合法商业运营的客运飞机班次,并遵守承运人关于安全乘坐的规定,自持有效机票检票并进入所乘客运飞机客舱时起至抵达机票载明的终点离开所乘客运飞机客舱的期间内遭受意外伤害所导致的保险责任;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>保险费:&yen;30/份; <span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>保额:航空意外伤害保险责任&yen;120万,航空意外伤害医疗责任最高可赔付&yen;5万元<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>售出可退(乘机日之前)<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>年龄:出生30天(含)至100周岁<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>保险公司将委托携程在各地有资质的服务商为有需要的客户提供保险定额发票以作报销。保险定额发票仅作报销凭证,不是保单凭证;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>数据电文是合法的合同表现形式,电子保单与纸质保单具有同等法律效力,请妥善保存。电子保单可在保险公司网站上查询和下载;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">"font-size: 12px;font-family: Arial,Tahoma,simsun;"</span>></span>产品详细条款可致电中航三星人寿热线400-810-1888或登录http://www.ssac.com.cn/进行垂询。<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>',</span><br><span class="line"> IsShowSharedFlight:true,</span><br><span class="line"> IsOpenSendFSR:true,</span><br><span class="line"> IsShowUpgradeClass:true,</span><br><span class="line"> AirLineMarketingConfig:"AQ,PN,KN",</span><br><span class="line"> ShowAvatarOfAirlineMarketing:true,</span><br><span class="line"> UpgradeClassDescription:{ZH:"<span class="tag"><<span class="name">p</span>></span>购买深航超值经济舱:<span class="tag"></<span class="name">p</span>></span><span class="tag"><<span class="name">ul</span> ></span><span class="tag"><<span class="name">li</span>></span>&#183;保证<span class="tag"><<span class="name">strong</span> <span class="attr">style</span>=<span class="string">color:#f60;</span>></span>100%<span class="tag"></<span class="name">strong</span>></span>免费升级至尊鹏头等舱。<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>&#183;享受机场贵宾休息室、空中专属服务等全程礼遇。<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>&#183;免费行李额40KG,按200%比例累积里程。<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>&#183;报销凭证为升舱后头等舱行程单。<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>"},</span><br><span class="line"> IsShowFlightAgent:false,</span><br><span class="line"> IgnoreFreeTravelAirline:"9C",</span><br><span class="line"> IsOpenAnnouncement:"T",</span><br><span class="line"> AirLineInsuranceConfig:"CA,1200000",</span><br><span class="line"> SichuanAirlinesConfig:"CTU",</span><br><span class="line"> IsOpenAsyncGetTGQ:true,</span><br><span class="line"> isTopAMT:true,</span><br><span class="line"> topAMTCode:"cz,sc,mu,ca,jd,mf,fm,pn,aq,ky,8l,gx,zh,ho,qw,hu,gj,fu,dz,gs,3u,y8,cn",</span><br><span class="line"> strictMKTAirline:"CZ|AirLineMarketing,CZ|AvatarOfAirlineMarketing|CZ|BusinessPriority,CZ|TravelPackage,CZ|PriorityPackage,CZ|BusinessProduct,CZ|BusinessPackage,CA|AirLineMarketing,CA|AvatarOfAirlineMarketing,MU|AirLineMarketing,MU|AvatarOfAirlineMarketing,FM|AirLineMarketing,FM|AvatarOfAirlineMarketing,HU|AirLineMarketing,HU|AvatarOfAirlineMarketing,3U|AirLineMarketing,3U|AvatarOfAirlineMarketing,8C|AirLineMarketing,8C|AvatarOfAirlineMarketing,8L|AirLineMarketing,8L|AvatarOfAirlineMarketing,9C|AirLineMarketing,9C|AvatarOfAirlineMarketing,A6|AirLineMarketing,A6|AvatarOfAirlineMarketing,AQ|AirLineMarketing,AQ|AvatarOfAirlineMarketing,BK|AirLineMarketing,BK|AvatarOfAirlineMarketing,CN|AirLineMarketing,CN|AvatarOfAirlineMarketing,DR|AirLineMarketing,DR|AvatarOfAirlineMarketing,DZ|AirLineMarketing,DZ|AvatarOfAirlineMarketing,EU|AirLineMarketing,EU|AvatarOfAirlineMarketing,FU|AirLineMarketing,FU|AvatarOfAirlineMarketing,G5|AirLineMarketing,G5|AvatarOfAirlineMarketing,GJ|AirLineMarketing,GJ|AvatarOfAirlineMarketing,GS|AirLineMarketing,GS|AvatarOfAirlineMarketing,GX|AirLineMarketing,GX|AvatarOfAirlineMarketing,GY|AirLineMarketing,GY|AvatarOfAirlineMarketing,HO|AirLineMarketing,HO|AvatarOfAirlineMarketing,JD|AirLineMarketing,JD|AvatarOfAirlineMarketing,JR|AirLineMarketing,JR|AvatarOfAirlineMarketing,KN|AirLineMarketing,KN|AvatarOfAirlineMarketing,KY|AirLineMarketing,KY|AvatarOfAirlineMarketing,MF|AirLineMarketing,MF|AvatarOfAirlineMarketing,NS|AirLineMarketing,NS|AvatarOfAirlineMarketing,OQ|AirLineMarketing,OQ|AvatarOfAirlineMarketing,PN|AirLineMarketing,PN|AvatarOfAirlineMarketing,QW|AirLineMarketing,QW|AvatarOfAirlineMarketing,RY|AirLineMarketing,RY|AvatarOfAirlineMarketing,SC|AirLineMarketing,SC|AvatarOfAirlineMarketing,TV|AirLineMarketing,TV|AvatarOfAirlineMarketing,UQ|AirLineMarketing,UQ|AvatarOfAirlineMarketing,VD|AirLineMarketing,VD|AvatarOfAirlineMarketing,Y8|AirLineMarketing,Y8|AvatarOfAirlineMarketing,YI|AirLineMarketing,YI|AvatarOfAirlineMarketing,ZH|AirLineMarketing,ZH|AvatarOfAirlineMarketing,CA|PriorityPackage,CA|TravelPackage,MU|PriorityPackage,MU|TravelPackage,FM|PriorityPackage,FM|TravelPackage,HU|PriorityPackage,HU|TravelPackage,3U|PriorityPackage,3U|TravelPackage,8C|PriorityPackage,8C|TravelPackage,8L|PriorityPackage,8L|TravelPackage,9C|PriorityPackage,9C|TravelPackage,A6|PriorityPackage,A6|TravelPackage,AQ|PriorityPackage,AQ|TravelPackage,BK|PriorityPackage,BK|TravelPackage,CN|PriorityPackage,CN|TravelPackage,DR|PriorityPackage,DR|TravelPackage,DZ|PriorityPackage,DZ|TravelPackage,EU|PriorityPackage,EU|TravelPackage,FU|PriorityPackage,FU|TravelPackage,G5|PriorityPackage,G5|TravelPackage,GJ|PriorityPackage,GJ|TravelPackage,GS|PriorityPackage,GS|TravelPackage,GX|PriorityPackage,GX|TravelPackage,GY|PriorityPackage,GY|TravelPackage,HO|PriorityPackage,HO|TravelPackage,JD|PriorityPackage,JD|TravelPackage,JR|PriorityPackage,JR|TravelPackage,KN|PriorityPackage,KN|TravelPackage,KY|PriorityPackage,KY|TravelPackage,MF|PriorityPackage,MF|TravelPackage,NS|PriorityPackage,NS|TravelPackage,OQ|PriorityPackage,OQ|TravelPackage,PN|PriorityPackage,PN|TravelPackage,QW|PriorityPackage,QW|TravelPackage,RY|PriorityPackage,RY|TravelPackage,SC|PriorityPackage,SC|TravelPackage,TV|PriorityPackage,TV|TravelPackage,UQ|PriorityPackage,UQ|TravelPackage,VD|PriorityPackage,VD|TravelPackage,Y8|PriorityPackage,Y8|TravelPackage,YI|PriorityPackage,YI|TravelPackage,ZH|PriorityPackage,ZH|TravelPackage",</span><br><span class="line"> UpgradeClass:false,</span><br><span class="line"> PackageCouponConfig1:'1.可用于携程国内旅游和出境游产品(不参加优惠券活动的产品除外);<span class="tag"><<span class="name">br</span>/></span>2.购买旅游度假产品订单满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>5000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>100<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>10000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>200<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>15000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>300<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>20000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>400<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>50000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>1000<span class="tag"></<span class="name">strong</span>></span>,每订单每个优惠券限用一次。不适用于签证、欧铁、用车、顶级游、门票、景点+酒店套餐及不参与优惠券活动的特例产品。优惠券不可与其他优惠活动同时使用。请登陆后输入代码确认可否使用。(有效期至${EffectDate});<span class="tag"><<span class="name">br</span>/></span>注:本产品特供网络及手机客户端用户专享',</span><br><span class="line"> PackageCouponConfig2:'1.可用于携程国内旅游和出境游产品(不参加优惠券活动的产品除外);<span class="tag"><<span class="name">br</span>/></span>2.购买旅游度假产品订单满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>5000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>100<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>10000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>200<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>20000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>400<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>50000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>1000<span class="tag"></<span class="name">strong</span>></span>、满<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>100000<span class="tag"></<span class="name">strong</span>></span>减<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span><span class="tag"><<span class="name">strong</span> <span class="attr">class</span>=<span class="string">"base_price"</span>></span>2000<span class="tag"></<span class="name">strong</span>></span>,每订单每个优惠券限用一次。不适用于签证、欧铁、用车、顶级游、门票、景点+酒店套餐及不参与优惠券活动的特例产品。优惠券不可与其他优惠活动同时使用。请登陆后输入代码确认可否使用。(有效期至${EffectDate});<span class="tag"><<span class="name">br</span>/></span>注:本产品特供网络及手机客户端用户专享',</span><br><span class="line"> CXTAirlinesConfig:[{"alc":"G5","sts":"ALL","ste":"ALL","dts":"2015-12-01 00:00:00","dte":"2015-12-31 23:59:59","tt":"华夏航特惠","te":"本产品由华夏航提供,专享0元火车票","cs":"ALL","fns":"ALL","transits":"CKG","routes":[{"dcc":"ALL","acc":"ALL"}]},{"alc":"-3U","sts":"2016-01-04 00:00:00","ste":"2016-01-17 23:59:59","dts":"ALL","dte":"ALL","tt":"重庆飞特惠","te":"本产品由重庆机场特别提供火车票减免优惠","cs":"ALL","fns":"ALL","transits":"CKG","routes":[{"dcc":"ALL","acc":"ALL"}]},{"alc":"3U","sts":"ALL","ste":"ALL","dts":"2015-12-01 00:00:00","dte":"2015-12-31 23:59:59","tt":"川行通特惠","te":"本产品由四川航空 “ 川行通 ” 特别提供","cs":"ALL","fns":"ALL","transits":"ALL","routes":[{"dcc":"ALL","acc":"ALL"}]},{"alc":"PN","sts":"ALL","ste":"ALL","dts":"ALL","dte":"ALL","tt":"西航“欢天·喜地”","te":"本优惠产品由西部航空特别提供","cs":"ALL","fns":"ALL","transits":"ALL","routes":[{"dcc":"ALL","acc":"ALL"}]}],</span><br><span class="line"> pcCodeAirlineName:{CA:"国航",KY:"昆明航空",ZH:"深航","3U":"川航"},</span><br><span class="line"> freeAdditionalProducts:[{"Id":0,"Type":7,"OrderType":16,"OrderProductType":256,"ProductType":5,"Name":"酒店优惠券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>100","Count":1,"PrintPrice":100,"SalePrice":0,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于500元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.使用优惠券成功预订并入住、在订单成交后3个工作日内,100元将返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>5.优惠券自发放之日起14天内有效。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.该优惠券不可退。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于500元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.使用优惠券成功预订并入住、在订单成交后3个工作日内,100元将返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>5.优惠券自发放之日起14天内有效。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.该优惠券不可退。","BookDescription":"","ProductCode":"","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":0,"Fields":null,"RuleId":0},{"Id":0,"Type":8,"OrderType":17,"OrderProductType":128,"ProductType":5,"Name":"接送机券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>70","Count":1,"PrintPrice":70,"SalePrice":0,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中带有“专享”标签的国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠70元,优惠券自发券日起90天内预订使用有效;<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中带有“专享”标签或“机票特权”国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠70元,优惠券自发券日起90天内预订使用有效;<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。","BookDescription":"","ProductCode":"","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":0,"Fields":null,"RuleId":0}],</span><br><span class="line"> additionalProducts:[{"Id":0,"Type":5,"OrderType":9,"OrderProductType":9,"ProductType":1,"Name":"酒店优惠券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>100","Count":1,"PrintPrice":100,"SalePrice":25,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.100元现金将在酒店订单成交后3个工作日内返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>5.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.优惠券不支持单独退订;已使用或已过期优惠券的套餐订单若发生退订,需在支付退订费时退还相应优惠券金额。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.100元现金将在酒店订单成交后3个工作日内返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>5.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.优惠券不支持单独退订;已使用或已过期优惠券的套餐订单若发生退订,需在支付退订费时退还相应优惠券金额。","BookDescription":"","ProductCode":"33","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":true,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":0,"Fields":null,"RuleId":0},{"Id":0,"Type":1,"OrderType":0,"OrderProductType":0,"ProductType":3,"Name":"航空意外险","SubTitle":"最高赔付&yen;320万","Count":1,"PrintPrice":30,"SalePrice":30,"OrderDescription":"","Description":"<span class="tag"><<span class="name">ul</span>></span><span class="tag"><<span class="name">li</span>></span>1、保险责任:指被保险人持有效机票检票并进入保单载明的合法商业运营的客运飞机客舱时起至抵达机票载明的终点离开客运飞机客舱的期间内遭受意外伤害所导致的保险责任;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>2、保额:航空意外伤害保险责任320万元/航段;选择国航直连订单保险责任变更为120万元/航段,由中银三星承保;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>3、保险费:30元/航段,计划起飞时间之前退票可退保;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>4、本产品由太平洋寿险、中国人寿、阳光人寿、众安在线、天安财险、华夏人寿、国华人寿、新华人寿、中银三星、太平养老、大都会人寿等保险公司承保,销售服务方为携程保险代理有限公司 <span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>","BookDescription":"","ProductCode":"C2C30","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon3","Index":0,"SelectMode":0,"Fields":null,"RuleId":0},{"Id":0,"Type":6,"OrderType":18,"OrderProductType":18,"ProductType":1,"Name":"门票礼包","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>100","Count":1,"PrintPrice":50,"SalePrice":30,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>【50元门票优惠券】<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.本优惠券可用于抵扣部分预付类国内门票产品,订单满200元减50元。<span class="tag"><<span class="name">br</span> /></span>2.有效期内每张优惠券仅限使用一次,不能和其他优惠共享。<span class="tag"><<span class="name">br</span> /></span>3.如发现恶意盗刷优惠券等行为,携程有权收回该行为涉及的优惠券,并取消所购产品。<span class="tag"><<span class="name">br</span> /></span>4.该优惠券不可退。<span class="tag"><<span class="name">br</span> /></span><span class="tag"><<span class="name">strong</span>></span>【50元玩乐优惠券】<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.本优惠券可用于抵扣部分当地玩乐频道预付类国内一日游产品,订单满200元减50元。<span class="tag"><<span class="name">br</span> /></span>2.有效期内每张优惠券仅限使用一次,不能和其他优惠共享。<span class="tag"><<span class="name">br</span> /></span>3.如发现恶意盗刷优惠券等行为,携程有权收回该行为涉及的优惠券,并取消所购品。<span class="tag"><<span class="name">br</span> /></span>4.该优惠券不可退。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>【50元门票优惠券】<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.本优惠券可用于抵扣部分预付类国内门票产品,订单满200元减50元。<span class="tag"><<span class="name">br</span> /></span>2.有效期内每张优惠券仅限使用一次,不能和其他优惠共享。<span class="tag"><<span class="name">br</span> /></span>3.如发现恶意盗刷优惠券等行为,携程有权收回该行为涉及的优惠券,并取消所购产品。<span class="tag"><<span class="name">br</span> /></span>4.该优惠券不可退。<span class="tag"><<span class="name">br</span> /></span><span class="tag"><<span class="name">strong</span>></span>【50元玩乐优惠券】<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.本优惠券可用于抵扣部分当地玩乐频道预付类国内一日游产品,订单满200元减50元。<span class="tag"><<span class="name">br</span> /></span>2.有效期内每张优惠券仅限使用一次,不能和其他优惠共享。<span class="tag"><<span class="name">br</span> /></span>3.如发现恶意盗刷优惠券等行为,携程有权收回该行为涉及的优惠券,并取消所购品。<span class="tag"><<span class="name">br</span> /></span>4.该优惠券不可退。","BookDescription":"","ProductCode":"34","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon4","Index":0,"SelectMode":0,"Fields":null,"RuleId":0}],</span><br><span class="line"> YPlusProducts:[{"Id":0,"Type":1,"OrderType":0,"OrderProductType":0,"ProductType":14,"Name":"抢票保障金","SubTitle":"抢票失败退一赔一","Count":1,"PrintPrice":300,"SalePrice":300,"OrderDescription":"","Description":"<span class="tag"><<span class="name">strong</span>></span>抢票保障金说明<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1、购买抢票保证金可提高抢票成功率至90%。<span class="tag"><<span class="name">br</span> /></span>2、抢票保障金在抢票成功后不予退还。<span class="tag"><<span class="name">br</span> /></span>3、抢票保障金在抢票失败后不予退还,票价(不含税)退一赔一。<span class="tag"><<span class="name">br</span> /></span>4、抢票结果最晚起飞前${PromiseMinutes}告知。","BookDescription":"","ProductCode":"","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon3","Index":0,"SelectMode":0,"Fields":null,"RuleId":0},{"Id":0,"Type":2,"OrderType":0,"OrderProductType":0,"ProductType":0,"Name":"抢票保障金","SubTitle":"抢票成功率${SuccessRate}%","Count":1,"PrintPrice":0,"SalePrice":0,"OrderDescription":"","Description":"<span class="tag"><<span class="name">strong</span>></span>抢票保障金说明<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1、购买抢票保证金可提高抢票成功率至90%。<span class="tag"><<span class="name">br</span> /></span>2、抢票保障金在抢票成功后不予退还。<span class="tag"><<span class="name">br</span> /></span>3、抢票保障金在抢票失败后不予退还,票价(不含税)退一赔一。<span class="tag"><<span class="name">br</span> /></span>4、抢票结果最晚起飞前${PromiseMinutes}告知。","BookDescription":"","ProductCode":"","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon3","Index":0,"SelectMode":0,"Fields":null,"RuleId":0}],</span><br><span class="line"> additionalProductsReplaceRules:[{"Filter":{"AirlineCode":"^(CA){1}$","SaleType":"^(AirLineMarketing|AvatarOfAirlineMarketing){1}$"},"ReplaceRule":{"1":{"Id":0,"Type":2,"OrderType":0,"OrderProductType":0,"ProductType":3,"Name":"航空意外险","SubTitle":"最高赔付<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>120万","Count":1,"PrintPrice":30,"SalePrice":30,"OrderDescription":"","Description":"<span class="tag"><<span class="name">ul</span> <span class="attr">class</span>=<span class="string">\</span>"<span class="attr">decimal</span>\"></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">\</span>"<span class="attr">font-size:</span> <span class="attr">12px</span>;<span class="attr">font-family:</span> <span class="attr">Arial</span>,<span class="attr">Tahoma</span>,<span class="attr">simsun</span>;\"></span>保险责任:指被保险人持有效机票检票并进入保单载明的合法商业运营的客运飞机客舱时起至抵达机票载明的终点离开客运飞机客舱的期间内遭受意外伤害所导致的保险责任;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">\</span>"<span class="attr">font-size:</span> <span class="attr">12px</span>;<span class="attr">font-family:</span> <span class="attr">Arial</span>,<span class="attr">Tahoma</span>,<span class="attr">simsun</span>;\"></span>保额:航空意外伤害保险责任120万元/航段;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">\</span>"<span class="attr">font-size:</span> <span class="attr">12px</span>;<span class="attr">font-family:</span> <span class="attr">Arial</span>,<span class="attr">Tahoma</span>,<span class="attr">simsun</span>;\"></span>保险费:30元/航段,计划起飞时间之前退票可退保;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">\</span>"<span class="attr">font-size:</span> <span class="attr">12px</span>;<span class="attr">font-family:</span> <span class="attr">Arial</span>,<span class="attr">Tahoma</span>,<span class="attr">simsun</span>;\"></span>发票:提供保险定额发票作为报销凭证; <span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">\</span>"<span class="attr">font-size:</span> <span class="attr">12px</span>;<span class="attr">font-family:</span> <span class="attr">Arial</span>,<span class="attr">Tahoma</span>,<span class="attr">simsun</span>;\"></span>保单验真:<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">\</span>"<span class="attr">http:</span>//<span class="attr">www.ssac.com.cn</span>/<span class="attr">Online</span>/<span class="attr">FlightInsQuery.aspx</span>?<span class="attr">ColumnId</span>=<span class="string">131\</span>" <span class="attr">target</span>=<span class="string">\</span>"<span class="attr">_blank</span>\"></span>http://www.ssac.com.cn/Online/FlightInsQuery.aspx?ColumnId=131<span class="tag"></<span class="name">a</span>></span>;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span> <span class="attr">style</span>=<span class="string">\</span>"<span class="attr">font-size:</span> <span class="attr">12px</span>;<span class="attr">font-family:</span> <span class="attr">Arial</span>,<span class="attr">Tahoma</span>,<span class="attr">simsun</span>;\"></span>本产品由中银三星承保,销售服务方为携程保险代理有限公司;<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>","BookDescription":"","ProductCode":"C2C30","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon3","Index":0,"SelectMode":1,"Fields":null,"RuleId":0}}},{"Filter":{"ExtensionFlag":"512"},"ReplaceRule":{"1":{"Id":0,"Type":4,"OrderType":7,"OrderProductType":8,"ProductType":1,"Name":"景酒优惠券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>50","Count":1,"PrintPrice":50,"SalePrice":30,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>景酒优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张50元优惠券,可用于抵扣携程旅游/酒店-酒店+景点频道下的旅游产品;<span class="tag"><<span class="name">br</span> /></span>2.每张酒店+景点(自驾游)订单限用一张优惠券,满800-50元,每张优惠券限用1次(有效期自领券日起150天内出行预订有效)。<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>景酒优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张50元优惠券,可用于抵扣携程旅游/酒店-酒店+景点频道下的旅游产品;<span class="tag"><<span class="name">br</span> /></span>2.每张酒店+景点(自驾游)订单限用一张优惠券,满800-50元,每张优惠券限用1次(有效期自领券日起150天内出行预订有效)。<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。","BookDescription":"","ProductCode":"35","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":0,"Fields":null,"RuleId":0}}},{"Filter":{"ExtensionFlag":"4","ProductSource":"1"},"ReplaceRule":{"1":{"Id":0,"Type":4,"OrderType":7,"OrderProductType":8,"ProductType":1,"Name":"景酒优惠券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>50","Count":1,"PrintPrice":50,"SalePrice":30,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>景酒优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张50元优惠券,可用于抵扣携程旅游/酒店-酒店+景点频道下的旅游产品;<span class="tag"><<span class="name">br</span> /></span>2.每张酒店+景点(自驾游)订单限用一张优惠券,满800-50元,每张优惠券限用1次(有效期自领券日起150天内出行预订有效)。<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>景酒优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张50元优惠券,可用于抵扣携程旅游/酒店-酒店+景点频道下的旅游产品;<span class="tag"><<span class="name">br</span> /></span>2.每张酒店+景点(自驾游)订单限用一张优惠券,满800-50元,每张优惠券限用1次(有效期自领券日起150天内出行预订有效)。<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。","BookDescription":"","ProductCode":"35","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":0,"Fields":null,"RuleId":0}}},{"Filter":{"ExtensionFlag":"4","ProductSource":"3"},"ReplaceRule":{"1":{"Id":0,"Type":4,"OrderType":7,"OrderProductType":8,"ProductType":1,"Name":"景酒优惠券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>50","Count":1,"PrintPrice":50,"SalePrice":30,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>景酒优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张50元优惠券,可用于抵扣携程旅游/酒店-酒店+景点频道下的旅游产品;<span class="tag"><<span class="name">br</span> /></span>2.每张酒店+景点(自驾游)订单限用一张优惠券,满800-50元,每张优惠券限用1次(有效期自领券日起150天内出行预订有效)。<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>景酒优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张50元优惠券,可用于抵扣携程旅游/酒店-酒店+景点频道下的旅游产品;<span class="tag"><<span class="name">br</span> /></span>2.每张酒店+景点(自驾游)订单限用一张优惠券,满800-50元,每张优惠券限用1次(有效期自领券日起150天内出行预订有效)。<span class="tag"><<span class="name">br</span> /></span>3.该优惠券不可退。","BookDescription":"","ProductCode":"35","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":0,"Fields":null,"RuleId":0}}},{"Filter":{"SaleType":"^BusinessPackage$","AbTestValue":"150323_fld_hltcp:G"},"ReplaceRule":{"4":{"Id":0,"Type":5,"OrderType":9,"OrderProductType":9,"ProductType":1,"Name":"酒店优惠券","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>100","Count":1,"PrintPrice":100,"SalePrice":25,"OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.100元现金将在酒店订单成交后3个工作日内返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>5.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.优惠券不支持单独退订;已使用或已过期优惠券的套餐订单若发生退订,需在支付退订费时退还相应优惠券金额。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.100元现金将在酒店订单成交后3个工作日内返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>5.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.优惠券不支持单独退订;已使用或已过期优惠券的套餐订单若发生退订,需在支付退订费时退还相应优惠券金额。","BookDescription":"","ProductCode":"33","ExpiryMonths":3,"ExpiryStartTime":"2016-05-11 07:10:48","IsSelected":false,"XProductType":0,"CssName":"combo_icon5","Index":0,"SelectMode":1,"Fields":null,"RuleId":0}}}],</span><br><span class="line"> additionalProductContentInfos:[{"ID":"1_0","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>${PrintPrice}","OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中产品左上角带有“专享”标签的国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠${PrintPrice}元,优惠券自发券日起90天内预订使用有效;<span class="tag"><<span class="name">br</span> /></span>3.优惠券在有效期内未使用可随机票一起退订,若优惠券已使用或超过使用有效期限,订单发生退订时须返还相应优惠券金额。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中带有“专享”标签或“机票特权”国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠${PrintPrice}元,优惠券自发券日起90天内预订使用有效;<span class="tag"><<span class="name">br</span> /></span>3.优惠券在有效期内未使用可随机票一起退订,若优惠券已使用或超过使用有效期限,订单发生退订时须返还相应优惠券金额。","BookDescription":"<span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中带有“专享”标签或“机票特权”国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠${PrintPrice}元,优惠券自发券日起90天内预订使用有效;<span class="tag"><<span class="name">br</span> /></span>3.优惠券在有效期内未使用可随机票一起退订,若优惠券已使用或超过使用有效期限,订单发生退订时须返还相应优惠券金额。","ExpiryMonths":3},{"ID":"8_0","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>${PrintPrice}","OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中产品左上角带有“专享”标签的国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠${PrintPrice}元,优惠券自发券日起90天内预订使用有效。<span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中带有“专享”标签或“机票特权”国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠${PrintPrice}元,优惠券自发券日起90天内预订使用有效。","BookDescription":"<span class="tag"><<span class="name">strong</span>></span>接送机券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.可用于携程用车-国内接送机频道中带有“专享”标签或“机票特权”国内接送机产品;<span class="tag"><<span class="name">br</span> /></span>2.用车时间不限,支持网站及手机预订使用,每张订单优惠${PrintPrice}元,优惠券自发券日起90天内预订使用有效。","ExpiryMonths":3},{"ID":"0_1","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>${PrintPrice}","OrderDescription":"<span class="tag"><<span class="name">div</span>></span><span class="tag"><<span class="name">h4</span>></span>${DepartCityName}${DepartPortName}贵宾休息室使用说明:<span class="tag"></<span class="name">h4</span>></span><span class="tag"><<span class="name">ul</span>></span><span class="tag"><<span class="name">li</span>></span>1)可提供<span class="tag"><<span class="name">strong</span>></span>免费餐饮、专属wifi、登机提醒<span class="tag"></<span class="name">strong</span>></span>等超值贵宾服务和更<span class="tag"><<span class="name">strong</span>></span>舒适的候机环境<span class="tag"></<span class="name">strong</span>></span>,具体服务不同机场可能存在不同;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>2)使用时长2小时,航班起飞日起15天内有效;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>3)2周岁以下婴儿免费 。<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span><span class="tag"></<span class="name">div</span>></span>","Description":"<span class="tag"><<span class="name">h4</span>></span>${DepartCityName}${DepartPortName}贵宾休息室使用说明:<span class="tag"></<span class="name">h4</span>></span><span class="tag"><<span class="name">ul</span>></span><span class="tag"><<span class="name">li</span>></span>1)可提供<span class="tag"><<span class="name">strong</span>></span>免费餐饮、专属wifi、登机提醒<span class="tag"></<span class="name">strong</span>></span>等超值贵宾服务和更<span class="tag"><<span class="name">strong</span>></span>舒适的候机环境<span class="tag"></<span class="name">strong</span>></span>,具体服务不同机场可能存在不同;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>2)使用时长2小时,航班起飞日起15天内有效;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>3)2周岁以下婴儿免费 。<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>","BookDescription":"<span class="tag"><<span class="name">h4</span>></span>${DepartCityName}${DepartPortName}贵宾休息室使用说明:<span class="tag"></<span class="name">h4</span>></span><span class="tag"><<span class="name">ul</span>></span><span class="tag"><<span class="name">li</span>></span>1)可提供<span class="tag"><<span class="name">strong</span>></span>免费餐饮、专属wifi、登机提醒<span class="tag"></<span class="name">strong</span>></span>等超值贵宾服务和更<span class="tag"><<span class="name">strong</span>></span>舒适的候机环境<span class="tag"></<span class="name">strong</span>></span>,具体服务不同机场可能存在不同;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>2)使用时长2小时,航班起飞日起15天内有效;<span class="tag"></<span class="name">li</span>></span><span class="tag"><<span class="name">li</span>></span>3)2周岁以下婴儿免费 。<span class="tag"></<span class="name">li</span>></span><span class="tag"></<span class="name">ul</span>></span>","ExpiryMonths":3},{"ID":"512_0","SubTitle":"抵用<span class="tag"><<span class="name">dfn</span>></span>&yen;<span class="tag"></<span class="name">dfn</span>></span>${PrintPrice}","OrderDescription":"<span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.使用优惠券成功预订并入住、在订单成交后3个工作日内,100元将返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>5.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.该优惠券不可退。","Description":"<span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.使用优惠券成功预订并入住、在订单成交后3个工作日内,100元将返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>5.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.该优惠券不可退。","BookDescription":"<span class="tag"><<span class="name">strong</span>></span>酒店优惠券使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span> /></span>1.包含1张100元酒店优惠券。<span class="tag"><<span class="name">br</span> /></span>2.适用于单价大于300元的国内酒店(含港澳台)房型(旅行社、团购、小时房、特价房除外)。<span class="tag"><<span class="name">br</span> /></span>3.使用优惠券成功预订并入住、在订单成交后3个工作日内,100元将返还至您的携程账户。<span class="tag"><<span class="name">br</span> /></span>4.每张优惠券限用一次,每张订单限用一张优惠券,优惠券不得转赠他人。<span class="tag"><<span class="name">br</span> /></span>5.优惠券自发放之日起30天内有效。<span class="tag"><<span class="name">br</span> /></span>6.订单取消后,优惠券将实时退还到账户(实际未入住用户除外)。<span class="tag"><<span class="name">br</span> /></span>7.该优惠券不可退。","ExpiryMonths":3}],</span><br><span class="line"> IsOpenDirectChuanCoupon:true,</span><br><span class="line"> HXOptimizeSwitch:false,</span><br><span class="line"> comfortableConfig:'{"0-35":60,"35-45":65,"45-55":70,"55-65":75,"65-75":80,"75-85":85,"85-999":95}',</span><br><span class="line"> flightSearchAD:'{ "list": [] }',</span><br><span class="line"> loungeCouponName:"接送机+休息室",</span><br><span class="line"> isCombineSearch:true,</span><br><span class="line"> IsUseAjaxTGQAmountReturnText:false,</span><br><span class="line"> strictMKTNormalClassAirline:"CA|AirLineMarketing,CA|AvatarOfAirlineMarketing,CZ|AirLineMarketing,CZ|AvatarOfAirlineMarketing,MU|AirLineMarketing,MU|AvatarOfAirlineMarketing,FM|AirLineMarketing,FM|AvatarOfAirlineMarketing,HU|AirLineMarketing,HU|AvatarOfAirlineMarketing,3U|AirLineMarketing,3U|AvatarOfAirlineMarketing,8C|AirLineMarketing,8C|AvatarOfAirlineMarketing,8L|AirLineMarketing,8L|AvatarOfAirlineMarketing,9C|AirLineMarketing,9C|AvatarOfAirlineMarketing,A6|AirLineMarketing,A6|AvatarOfAirlineMarketing,AQ|AirLineMarketing,AQ|AvatarOfAirlineMarketing,BK|AirLineMarketing,BK|AvatarOfAirlineMarketing,CN|AirLineMarketing,CN|AvatarOfAirlineMarketing,DR|AirLineMarketing,DR|AvatarOfAirlineMarketing,DZ|AirLineMarketing,DZ|AvatarOfAirlineMarketing,EU|AirLineMarketing,EU|AvatarOfAirlineMarketing,FU|AirLineMarketing,FU|AvatarOfAirlineMarketing,G5|AirLineMarketing,G5|AvatarOfAirlineMarketing,GJ|AirLineMarketing,GJ|AvatarOfAirlineMarketing,GS|AirLineMarketing,GS|AvatarOfAirlineMarketing,GX|AirLineMarketing,GX|AvatarOfAirlineMarketing,GY|AirLineMarketing,GY|AvatarOfAirlineMarketing,HO|AirLineMarketing,HO|AvatarOfAirlineMarketing,JD|AirLineMarketing,JD|AvatarOfAirlineMarketing,JR|AirLineMarketing,JR|AvatarOfAirlineMarketing,KN|AirLineMarketing,KN|AvatarOfAirlineMarketing,KY|AirLineMarketing,KY|AvatarOfAirlineMarketing,MF|AirLineMarketing,MF|AvatarOfAirlineMarketing,NS|AirLineMarketing,NS|AvatarOfAirlineMarketing,OQ|AirLineMarketing,OQ|AvatarOfAirlineMarketing,PN|AirLineMarketing,PN|AvatarOfAirlineMarketing,QW|AirLineMarketing,QW|AvatarOfAirlineMarketing,RY|AirLineMarketing,RY|AvatarOfAirlineMarketing,SC|AirLineMarketing,SC|AvatarOfAirlineMarketing,TV|AirLineMarketing,TV|AvatarOfAirlineMarketing,UQ|AirLineMarketing,UQ|AvatarOfAirlineMarketing,VD|AirLineMarketing,VD|AvatarOfAirlineMarketing,Y8|AirLineMarketing,Y8|AvatarOfAirlineMarketing,YI|AirLineMarketing,YI|AvatarOfAirlineMarketing,ZH|AirLineMarketing,ZH|AvatarOfAirlineMarketing,CA|PriorityPackage,CA|TravelPackage,CZ|PriorityPackage,CZ|TravelPackage,MU|PriorityPackage,MU|TravelPackage,FM|PriorityPackage,FM|TravelPackage,HU|PriorityPackage,HU|TravelPackage,3U|PriorityPackage,3U|TravelPackage,8C|PriorityPackage,8C|TravelPackage,8L|PriorityPackage,8L|TravelPackage,9C|PriorityPackage,9C|TravelPackage,A6|PriorityPackage,A6|TravelPackage,AQ|PriorityPackage,AQ|TravelPackage,BK|PriorityPackage,BK|TravelPackage,CN|PriorityPackage,CN|TravelPackage,DR|PriorityPackage,DR|TravelPackage,DZ|PriorityPackage,DZ|TravelPackage,EU|PriorityPackage,EU|TravelPackage,FU|PriorityPackage,FU|TravelPackage,G5|PriorityPackage,G5|TravelPackage,GJ|PriorityPackage,GJ|TravelPackage,GS|PriorityPackage,GS|TravelPackage,GX|PriorityPackage,GX|TravelPackage,GY|PriorityPackage,GY|TravelPackage,HO|PriorityPackage,HO|TravelPackage,JD|PriorityPackage,JD|TravelPackage,JR|PriorityPackage,JR|TravelPackage,KN|PriorityPackage,KN|TravelPackage,KY|PriorityPackage,KY|TravelPackage,MF|PriorityPackage,MF|TravelPackage,NS|PriorityPackage,NS|TravelPackage,OQ|PriorityPackage,OQ|TravelPackage,PN|PriorityPackage,PN|TravelPackage,QW|PriorityPackage,QW|TravelPackage,RY|PriorityPackage,RY|TravelPackage,SC|PriorityPackage,SC|TravelPackage,TV|PriorityPackage,TV|TravelPackage,UQ|PriorityPackage,UQ|TravelPackage,VD|PriorityPackage,VD|TravelPackage,Y8|PriorityPackage,Y8|TravelPackage,YI|PriorityPackage,YI|TravelPackage,ZH|PriorityPackage,ZH|TravelPackage",</span><br><span class="line"> ALadingValue:"",</span><br><span class="line"> isBusinessPackageTag:true,</span><br><span class="line"> FreeGiftConfig:{"Lounge":{"Title":"赠休息室","Desc":"赠送价值¥200元的贵宾休息室一份<span class="tag"><<span class="name">br</span>></span><span class="tag"><<span class="name">strong</span>></span>贵宾休息室使用说明:<span class="tag"></<span class="name">strong</span>></span><span class="tag"><<span class="name">br</span>></span>1)携程贵宾休息室可提供免费餐饮等超值贵宾服务和更舒适的候机环境;<span class="tag"><<span class="name">br</span>></span>2)使用时长2小时,航班起飞当日有效;<span class="tag"><<span class="name">br</span>></span>3)2周岁以下婴儿免费。"}},</span><br><span class="line"> lightStyle:false,</span><br><span class="line"> AirlineMarketingAgencyIcons:null,</span><br><span class="line"> IsTravelPackageCloseFullInvoice:true,</span><br><span class="line"> UBTAirlineStoresConfig:"MU,CA,CZ,HU",</span><br><span class="line"> IsOpenBIRecResult:false,</span><br><span class="line"> strictHighFrequencyAirline:"ZH,DR", </span><br><span class="line"> FreeLuggageMaxAmount:20</span><br><span class="line"> };</span><br><span class="line"> var ssoInitLoginFlag = 'T';</span><br><span class="line"> function __SSO_submit(a, t) {</span><br><span class="line"> ssoInitLoginFlag = 'F';</span><br><span class="line"> if(a===null){</span><br><span class="line"> try{</span><br><span class="line"> if(SearchCondition.SearchType=="S"&&SearchBox){</span><br><span class="line"> SearchBox.reSearch();</span><br><span class="line"> }else{</span><br><span class="line"> location.href=location.href;</span><br><span class="line"> }</span><br><span class="line"> }catch(ex){}</span><br><span class="line"> return;</span><br><span class="line"> }</span><br><span class="line"> if ($("#" + a).length > 0) $("#" + a)[0].click();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="undefined"></span><br><span class="line"> $globalPad = true;</span><br><span class="line"> var WebResourcePath = "http://webresource.c-ctrip.com/ResFlightOnline/R1/Booking";</span><br><span class="line"> $LAB.script({src:"http://webresource.c-ctrip.com/code/cquery/cQuery_110421.js?ReleaseNo=CR_2016_05_10_19_57_18",charset:"utf-8"}).wait().padScript({src:"http://webresource.c-ctrip.com/code/cquery/pad.js?ReleaseNo=CR_2016_05_10_19_57_18",charset:"utf-8"}).wait().script({src:"http://webresource.c-ctrip.com/code/js/resource/jmpinfo_tuna/CraftType_gb2312.js?ReleaseNo=CR_2016_05_10_19_57_18",charset:"gb2312"}).wait().script({src:"http://webresource.c-ctrip.com/ResFlightOnline/R1/Booking/release/dest/FlightSearchResult_XFile.min.js?ReleaseNo=CR_2016_05_10_19_57_18",charset:"utf-8"}).wait(LoadCallback);</span><br><span class="line"></span><br><span class="line"> function LoadCallback(){ </span><br><span class="line"> if(typeof loadDomReady!="undefined"){</span><br><span class="line"> loadDomReady();</span><br><span class="line"> }</span><br><span class="line"> logTimer();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"http://webresource.c-ctrip.com/ResCRMOnline/R6/member/common/js/mask_young.js?20140603"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"base_ft"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/sitemap/sitemap.htm"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"网站导航"</span>></span>网站导航<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/jiudian/"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"宾馆索引"</span>></span>宾馆索引<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://flights.ctrip.com/booking/hot-city-flights-sitemap.html "</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"机票索引"</span>></span>机票索引<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/sitemap/dj.html"</span> <span class="attr">title</span>=<span class="string">"旅游索引"</span>></span>旅游索引<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://ct.ctrip.com/crptravel/sitemap.html"</span> <span class="attr">title</span>=<span class="string">"商旅索引"</span>></span>商旅索引<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">title</span>=<span class="string">"攻略索引"</span> <span class="attr">href</span>=<span class="string">"http://you.ctrip.com/sitemap/"</span>></span>攻略索引<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/ctripab/abctrip.htm"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"关于携程"</span>></span>关于携程<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/commerce/promote/201201/other/qygm/index.html"</span> <span class="attr">title</span>=<span class="string">"企业公民"</span>></span>企业公民<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"诚聘英才"</span> <span class="attr">href</span>=<span class="string">"http://job.ctrip.com/"</span>></span>诚聘英才</span><br><span class="line"> <span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">title</span>=<span class="string">"智慧旅游"</span> <span class="attr">href</span>=<span class="string">"http://you.ctrip.com/Intelligence.html"</span>></span>智慧旅游<span class="tag"></<span class="name">a</span>></span>&#xA0;</span><br><span class="line"> |&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://u.ctrip.com/"</span> <span class="attr">title</span>=<span class="string">"分销联盟"</span>></span>分销联盟<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/dlhz.htm"</span> <span class="attr">title</span>=<span class="string">"代理合作"</span>></span>代理合作<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://ct.ctrip.com"</span> <span class="attr">title</span>=<span class="string">"企业商旅"</span>></span>企业商旅<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://ct.ctrip.com/crptravel/default/landing"</span> <span class="attr">title</span>=<span class="string">"中小企业差旅"</span>></span>中小企业差旅<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/ctripad/adyw.htm"</span> <span class="attr">title</span>=<span class="string">"广告业务"</span>></span>广告业务<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/contact.htm"</span> <span class="attr">title</span>=<span class="string">"联系我们"</span>></span>联系我们<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://hotels.ctrip.com/jiameng#ctm_ref=ctr_def_btm_hsu_n_1"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"酒店加盟"</span>></span>酒店加盟<span class="tag"></<span class="name">a</span>></span>&#xA0;|</span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/commerce/promote/201501/destination/mdd/index.html"</span>></span>旅游局及景区合作<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;</span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/serve%20guideline.htm"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">title</span>=<span class="string">"服务说明"</span>></span>服务说明<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;</span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/diploma/company.htm"</span>></span>营业执照<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/tour/ingroupline_pages.asp?folder=ingroup0904&amp;file=0177"</span> <span class="attr">title</span>=<span class="string">"旅游度假资质"</span>></span>旅游度假资质<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://kefu.ctrip.com/insurance/index.aspx"</span>></span>保险代理<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/link/ctrip_link.html"</span>></span>友情链接<span class="tag"></<span class="name">a</span>></span>&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">href</span>=<span class="string">"http://pages.ctrip.com/public/copyright.htm"</span> <span class="attr">id</span>=<span class="string">"copyright"</span>></span>Copyright&copy;<span class="tag"></<span class="name">a</span>></span>, <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.ctrip.com/"</span>></span> ctrip.com<span class="tag"></<span class="name">a</span>></span>. All rights reserved.&#xA0;|&#xA0;<span class="tag"><<span class="name">a</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"http://www.miibeian.gov.cn/"</span>></span>ICP证:沪B2-20050130<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"gns"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31010502000018"</span>></span><span class="tag"><<span class="name">i</span> <span class="attr">class</span>=<span class="string">"icon-gns"</span>></span><span class="tag"></<span class="name">i</span>></span>沪公网备31010502000018号<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"honour_wrap"</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.itrust.org.cn/yz/pjwx.asp?wm=163178864X"</span> <span class="attr">title</span>=<span class="string">"网信编码:163178864X"</span> <span class="attr">class</span>=<span class="string">"honour1"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span>></span>信用评级<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.sgs.gov.cn/lz/licenseLink.do?method=licenceView&amp;entyId=20110428175405415"</span> <span class="attr">title</span>=<span class="string">"工商亮照标识"</span> <span class="attr">class</span>=<span class="string">"honour2"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span>></span>上海工商<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://search.cxwz.org/cert/l/CX20111018000615000623"</span> <span class="attr">title</span>=<span class="string">"诚信认证示范企业"</span> <span class="attr">class</span>=<span class="string">"honour3"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span>></span>诚信网站<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.zx110.org/"</span> <span class="attr">class</span>=<span class="string">"honour4"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">title</span>=<span class="string">"征信网"</span>></span>网络社会征信网<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.shjbzx.cn/"</span> <span class="attr">class</span>=<span class="string">"honour5"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">title</span>=<span class="string">"上海市互联网违法与违规信息举报中心"</span>></span>信息举报中心<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"https://ss.knet.cn/verifyseal.dll?sn=e12061531010025926306977"</span> <span class="attr">class</span>=<span class="string">"honour6"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span> <span class="attr">title</span>=<span class="string">"可信网站"</span>></span>可信网站<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"http://www.12377.cn/"</span> <span class="attr">class</span>=<span class="string">"honour8"</span> <span class="attr">title</span>=<span class="string">"违法和不良信息举报中心"</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">rel</span>=<span class="string">"nofollow"</span>></span>违法和不良信息举报中心<span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span><span class="tag"><<span class="name">config</span> <span class="attr">id</span>=<span class="string">"timespan"</span> <span class="attr">value</span>=<span class="string">"20160329"</span>></span><span class="tag"></<span class="name">config</span>></span><span class="comment"><!-- InstanceEnd name="position" --></span><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="undefined">var globalConfig={H1:'https',H3:'my.ctrip.com',Lang:'gb2312',AjaxUrl:'accounts.ctrip.com'};</span><span class="tag"></<span class="name">script</span>></span><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"http://webresource.c-ctrip.com/ResCRMOnline/R1/pageheader/js/PageHeadController.js?temp=20160510"</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"comfort_bg_left"</span> <span class="attr">id</span>=<span class="string">"comfortableSortMessage"</span> <span class="attr">style</span>=<span class="string">"position: absolute;top:-1000px;left:0px;z-index:2002"</span>></span><span class="tag"></<span class="name">div</span>></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"mask_content"</span> <span class="attr">id</span>=<span class="string">"comfortableMessage"</span> <span class="attr">style</span>=<span class="string">"top:-1000px;left:0px;z-index:2002"</span> ></span><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"comfort_bg_right"</span>></span><span class="tag"></<span class="name">div</span>></span><span class="tag"><<span class="name">a</span> <span class="attr">class</span>=<span class="string">"btn"</span> <span class="attr">href</span>=<span class="string">"javascript:;"</span> <span class="attr">id</span>=<span class="string">"CloseComfortableMessage"</span>></span><span class="tag"></<span class="name">a</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure></p>
<p>从下图的代码处可以看到参数r的值<br><img src="/2016/05/11/get-ctrip-flights-info-2/get_r_parameter.png" alt="参数r"></p>
<h4 id="CK和rk参数值的获取(如果只想看最终结果请自行跳到下一节)"><a href="#CK和rk参数值的获取(如果只想看最终结果请自行跳到下一节)" class="headerlink" title="CK和rk参数值的获取(如果只想看最终结果请自行跳到下一节)"></a>CK和rk参数值的获取(如果只想看最终结果请自行跳到下一节)</h4><p>这两个参数就无法从主页面中直接获取到了,那么看一下主页面中执行的js文件吧,在主页面源代码的23-32行部分是显示数据的核心部分,在这里定义并且调用了ajaxRequest函数,把这个函数搞清楚那么CK和rk的值就弄清楚了。下面贴出来经过反向格式化的ajaxRequest函数代码<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">ajaxRequest</span>(<span class="params">n, t</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> i = <span class="literal">null</span>,</span><br><span class="line"> e, f, l, o, s, r, c, u, h;</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">typeof</span> XMLHttpRequest != <span class="string">"undefined"</span>) i = <span class="keyword">new</span> XMLHttpRequest;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (<span class="keyword">typeof</span> ActiveXObject != <span class="string">"undefined"</span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="built_in">arguments</span>.callee.aciveXString != <span class="string">"string"</span>) <span class="keyword">for</span> (e = [<span class="string">"MSXML2.XMLHttp.6.0"</span>, <span class="string">"MSXML2.XMLHttp.3.0"</span>, <span class="string">"MSXML2.XMLHttp"</span>], f = <span class="number">0</span>, l = e.length; f < l; f++) <span class="keyword">try</span> {</span><br><span class="line"> i = <span class="keyword">new</span> ActiveXObject(e[f]);</span><br><span class="line"> <span class="built_in">arguments</span>.callee.activeXString = e[f];</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> } <span class="keyword">catch</span> (a) {}</span><br><span class="line"> i == <span class="literal">null</span> && (i = <span class="keyword">new</span> ActiveXObject(<span class="built_in">arguments</span>.callee.activeXString))</span><br><span class="line"> }</span><br><span class="line"> i.onreadystatechange = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (i.readyState == <span class="number">4</span>) <span class="keyword">if</span> (i.status >= <span class="number">200</span> && i.status < <span class="number">300</span> || i.status == <span class="number">304</span>) {</span><br><span class="line"> <span class="keyword">var</span> r = <span class="built_in">eval</span>(<span class="string">"("</span> + i.responseText + <span class="string">")"</span>);</span><br><span class="line"> <span class="keyword">if</span> (_searchCount_c == <span class="number">0</span> && r && r.Error && r.Error.Code == <span class="number">104</span> && (r.Error.Message == <span class="string">""</span> || !r.Error.Message)) {</span><br><span class="line"> _searchCount_c++;</span><br><span class="line"> setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> i = n.split(<span class="string">"&"</span>);</span><br><span class="line"> i.pop();</span><br><span class="line"> ajaxRequest(i.join(<span class="string">"&"</span>) + <span class="string">"&rt="</span> + <span class="built_in">Math</span>.random() * <span class="number">1e3</span>, t)</span><br><span class="line"> }, <span class="number">1e3</span>);</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> jsonCallback.done(r)</span><br><span class="line"> } <span class="keyword">else</span> i.status != <span class="number">0</span> && jsonCallback.onError()</span><br><span class="line"> } <span class="keyword">catch</span> (u) {</span><br><span class="line"> jsonCallback.onError()</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> <span class="built_in">window</span>.location.hash && (o = <span class="built_in">window</span>.location.hash.match(<span class="regexp">/DDate1=\d{4}-\d{2}-\d{2}/</span>), o && o.length > <span class="number">0</span> && (n = n.replace(<span class="regexp">/DDate1=(\d{4}-\d{2}-\d{2})/ig</span>, o[<span class="number">0</span>])), s = <span class="built_in">window</span>.location.hash.match(<span class="regexp">/DDate2=\d{4}-\d{2}-\d{2}/</span>), s && s.length > <span class="number">0</span> && (n = n.replace(<span class="regexp">/DDate2=(\d{4}-\d{2}-\d{2})/ig</span>, s[<span class="number">0</span>])));</span><br><span class="line"> r = n.replace(<span class="regexp">/^[\s\xA0]+|[\s\xA0]+$/g</span>, <span class="string">""</span>);</span><br><span class="line"> (r.indexOf(<span class="string">"ClassType=CF"</span>) == <span class="number">-1</span> || r.indexOf(<span class="string">"ClassType=&"</span>) != <span class="number">-1</span>) && (r += getStorage(<span class="string">"FD_SearchPage_onlyCf"</span>) == <span class="string">"CF"</span> ? <span class="string">"&ClassType=CF"</span> : <span class="string">""</span>);</span><br><span class="line"> _searchCount_c > <span class="number">0</span> && (c = t.split(<span class="string">"."</span>)[<span class="number">1</span>], t = <span class="string">"0."</span> + c.substring(<span class="number">1</span>, c.length - <span class="number">1</span>));</span><br><span class="line"> u = r.split(<span class="string">"&"</span>);</span><br><span class="line"> h = r.indexOf(<span class="string">"rk="</span>) >= <span class="number">0</span> || r.indexOf(<span class="string">"rt="</span>) >= <span class="number">0</span> ? u.splice(u.length - <span class="number">2</span>, <span class="number">1</span>)[<span class="number">0</span>] : u.pop();</span><br><span class="line"> u.push(<span class="string">"CK="</span>);</span><br><span class="line"> h = h.split(<span class="string">"="</span>)[<span class="number">1</span>];</span><br><span class="line"> <span class="keyword">var</span> fn = (<span class="function"><span class="keyword">function</span>(<span class="params">u, r, k, t</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> A1 = <span class="number">1</span>,</span><br><span class="line"> B1A = <span class="number">1</span>;</span><br><span class="line"> A1 = A1 *= <span class="built_in">parseInt</span>(<span class="built_in">Math</span>.tan(<span class="number">9</span>) * <span class="number">0xa</span>);</span><br><span class="line"> A1 = A1 -= <span class="built_in">parseInt</span>(<span class="built_in">Math</span>.sqrt(<span class="number">9</span>) * <span class="number">0xa</span>);</span><br><span class="line"> <span class="keyword">if</span> (A1 < <span class="number">0</span>) A1 = -A1;</span><br><span class="line"> <span class="keyword">while</span> (A1 > <span class="number">30</span>) A1 = A1 % <span class="number">10</span>;</span><br><span class="line"> B1A = B1A *= <span class="built_in">parseInt</span>(<span class="built_in">Math</span>.atan(<span class="number">5</span>) * <span class="number">0xa</span>);</span><br><span class="line"> <span class="keyword">if</span> (B1A < <span class="number">0</span>) B1A = -B1A;</span><br><span class="line"> <span class="keyword">while</span> (B1A > <span class="number">30</span>) B1A = B1A % <span class="number">10</span>;</span><br><span class="line"> (<span class="function"><span class="keyword">function</span>(<span class="params">r, u, x, y, t, k</span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> (!<span class="built_in">window</span>.location.href) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">var</span> l = r.split(<span class="string">''</span>);</span><br><span class="line"> <span class="keyword">var</span> c = l.splice(y, <span class="number">1</span>);</span><br><span class="line"> l.splice(x, <span class="number">0</span>, c);</span><br><span class="line"> t.open(<span class="string">'GET'</span>, u.join(<span class="string">'&'</span>) + l.join(<span class="string">''</span>) + <span class="string">'&r='</span> + k, !<span class="number">0</span>);</span><br><span class="line"> t.send(<span class="literal">null</span>);</span><br><span class="line"> })(r, u, A1, B1A, t, k)</span><br><span class="line"> });</span><br><span class="line"> fn(u, h, t, i)</span><br><span class="line">}</span><br><span class="line"><span class="keyword">var</span> jsonCallback = {</span><br><span class="line"> isError: !<span class="number">1</span>,</span><br><span class="line"> isReady: !<span class="number">1</span>,</span><br><span class="line"> data: {},</span><br><span class="line"> readyList: [],</span><br><span class="line"> errorList: [],</span><br><span class="line"> ready: <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">this</span>.isReady == !<span class="number">1</span> ? <span class="keyword">this</span>.readyList.push(n) : n(<span class="keyword">this</span>.data)</span><br><span class="line"> },</span><br><span class="line"> done: <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">this</span>.isReady = !<span class="number">0</span>;</span><br><span class="line"> <span class="keyword">this</span>.data = n;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> t = <span class="number">0</span>; <span class="keyword">this</span>.readyList[t];) <span class="keyword">this</span>.readyList[t](n), t++</span><br><span class="line"> },</span><br><span class="line"> error: <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">this</span>.isError == !<span class="number">1</span> ? <span class="keyword">this</span>.errorList.push(n) : n()</span><br><span class="line"> },</span><br><span class="line"> onError: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">this</span>.isError = !<span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> n = <span class="number">0</span>; <span class="keyword">this</span>.errorList[n];) <span class="keyword">this</span>.errorList[n](), n++</span><br><span class="line"> }</span><br><span class="line">},</span><br><span class="line"> getStorage = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> i, r, t;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (i = <span class="string">"{}"</span>, <span class="built_in">window</span>.localStorage) i = localStorage.getItem(<span class="string">"jStorage"</span>);</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (<span class="built_in">window</span>.globalStorage) i = <span class="built_in">window</span>.globalStorage[<span class="built_in">window</span>.location.hostname];</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> r = <span class="built_in">document</span>.head || <span class="built_in">document</span>.getElementsByTagName(<span class="string">"head"</span>)[<span class="number">0</span>];</span><br><span class="line"> t = <span class="built_in">document</span>.createElement(<span class="string">"link"</span>);</span><br><span class="line"> t.style.behavior = <span class="string">"url(#default#userData)"</span>;</span><br><span class="line"> r.appendChild(t);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> t.load(<span class="string">"jStorage"</span>)</span><br><span class="line"> } <span class="keyword">catch</span> (u) {</span><br><span class="line"> t.setAttribute(<span class="string">"jStorage"</span>, <span class="string">"{}"</span>);</span><br><span class="line"> t.save(<span class="string">"jStorage"</span>);</span><br><span class="line"> t.load(<span class="string">"jStorage"</span>)</span><br><span class="line"> }</span><br><span class="line"> i = t.getAttribute(<span class="string">"jStorage"</span>) || <span class="string">"{}"</span>;</span><br><span class="line"> r.removeChild(t)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> !i || i == <span class="string">"{}"</span> ? <span class="string">""</span> : <span class="built_in">eval</span>(<span class="string">"("</span> + i + <span class="string">")"</span>)[n]</span><br><span class="line"> } <span class="keyword">catch</span> (f) {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">""</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></p>
<p>首先看函数的两个参数,第一个参数是字符串 “<a href="http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&CK=36B05DD175F36398546F66CA5EFD07DE&rk=Math.random()*10+'071048" target="_blank" rel="external">http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&CK=36B05DD175F36398546F66CA5EFD07DE&rk=Math.random()*10+'071048</a>‘“<br>注意:<strong>由于这里面有一个random函数,所以上面的rk是一个0-9之间的一个16位长度的小数加上后面的071048,例如rk=7.248395953793079071048。</strong><br>另一个参数是刚才给出的<strong>r</strong>的值,在函数内部这个参数名为<strong>t</strong>。<br>接下来是变量定义和生成XMLHttpRequest对象,和与XMLHttpRequest监视的状态发生变化(即readystatechange)相关联的函数……这些都不是关注的重点,继续往下看。<br>第32行开始用正则对日期的格式进行了统一,并且去掉了多余的空格,变量<strong>o</strong>的值为DDate1所对应的时间,此处就是2016-05-13,<br><strong>n</strong>中DDate值被替换为格式化后的值,其他位置保持不变;同理,DDate2也进行了类似的操作,<br><strong>s</strong>中存放的就是格式化后的值。<br>局部变量<strong>r</strong>中存放的是url中去掉多余空格后的形式,在这里就是 “<a href="http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&CK=36B05DD175F36398546F66CA5EFD07DE&rk=Math.random()*10+'071048" target="_blank" rel="external">http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&CK=36B05DD175F36398546F66CA5EFD07DE&rk=Math.random()*10+'071048</a>‘“ 这个字符串。<br>下面的c=t.split(“.”)[1]将变量t在”.”处分隔开,变成字符串数组[“0”,”1440474125154478474718”],然后将数组中的第二项赋值给<strong>c</strong>,因此此时c=”1440474125154478474718”;c.substring(1, c.length - 1)取得c的子串,去掉首位和末位,即“44047412515447847471”,执行过35行的语句后,<strong>t</strong>的值变为”0.44047412515447847471”。<br>第36行将<strong>r</strong>用”&”分隔开,得到变量<strong>u</strong>的值为 [ “<a href="http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB" target="_blank" rel="external">http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB</a>“ , “ACity1=SHA” , “SearchType=S” , “DDate1=2016-05-13” , “IsNearAirportRecommond=0” , “CK=36B05DD175F36398546F66CA5EFD07DE” , “rk=7.248395953793079071048” ] ,<br>第37行从u中删除掉倒数第二项,即”CK=36B05DD175F36398546F66CA5EFD07DE”这一项,并将其赋值给<strong>h</strong>,<br>第38行在u末尾添加了一项”CK=”,第39行<strong>h</strong>的值变为”36B05DD175F36398546F66CA5EFD07DE”,<br>第40-60行是fn函数的定义部分,61行调用了该函数,调用的形式为<br>fn([ “<a href="http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB" target="_blank" rel="external">http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB</a>“ , “ACity1=SHA” , “SearchType=S” , “DDate1=2016-05-13” , “IsNearAirportRecommond=0” , “CK=36B05DD175F36398546F66CA5EFD07DE” , “rk=7.248395953793079071048” ] , “36B05DD175F36398546F66CA5EFD07DE” , “0.44047412515447847471” , i),<br>下面看下在fn内部进行的操作<br>定义变量A1=1,B1A=1,tan(9)的值为-0.452315659,第43行A1的值为-4,第49行执行完后A1的值为4,B1A的值为13,<br>接下来执行一个函数function(r, u, x, y, t, k),传进的参数为<br>( “36B05DD175F36398546F66CA5EFD07DE” , [ “<a href="http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB“" target="_blank" rel="external">http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB“</a> , “ACity1=SHA” , “SearchType=S” , “DDate1=2016-05-13” , “IsNearAirportRecommond=0” , “rk=7.248395953793079071048” , “CK=” ] , 4 , 13 , i , “0.44047412515447847471” )<br>第54行<strong>l</strong>为 “36B05DD175F36398546F66CA5EFD07DE”被分割后的单个字符组成的数组。<br>第55行 将<strong>l</strong>中下标为13的元素删除并赋给变量<strong>c</strong><br>第56行 将<strong>c</strong>插入到<strong>l</strong>中索引为5的位置<br>第57行 通过XMLHttpRequest对象获取json数据,方式为GET,访问的URL格式为:<a href="http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&rk=7.248395953793079071048&CK=336B05DD175F3698546F66CA5EFD07DE&r=0.44047412515447847471" target="_blank" rel="external">http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&rk=7.248395953793079071048&CK=336B05DD175F3698546F66CA5EFD07DE&r=0.44047412515447847471</a></p>
<h4 id="三个参数取值结论"><a href="#三个参数取值结论" class="headerlink" title="三个参数取值结论"></a>三个参数取值结论</h4><p>rk取值:16位长度的小数加上主页面传进来的6位长的字符串,因此rk长度为22位(不算小数点)<br>CK取值:主页面传进来CK参数,将第13位上的数移到第5位上去。其长度为32位<br>r取值:主页面传进来的参数值</p>
<h3 id="爬虫完整实现"><a href="#爬虫完整实现" class="headerlink" title="爬虫完整实现"></a>爬虫完整实现</h3><p>下面用Python实现完整的数据抓取过程。<br>不妨查询哈尔滨到上海5月15号的机票信息。思路:我们首先构造主页面URL,<a href="http://flights.ctrip.com/booking/hrb-sha-day-1.html?ddate1=2016-05-15,然后获取到响应的参数值并构造出rk、CK、r这三个参数值,然后访问那个包含json格式数据的网页,并获取数据。下面是Python的代码示例" target="_blank" rel="external">http://flights.ctrip.com/booking/hrb-sha-day-1.html?ddate1=2016-05-15,然后获取到响应的参数值并构造出rk、CK、r这三个参数值,然后访问那个包含json格式数据的网页,并获取数据。下面是Python的代码示例</a><br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#coding:utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"><span class="keyword">from</span> lxml <span class="keyword">import</span> etree</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line">reload(sys)</span><br><span class="line">sys.setdefaultencoding(<span class="string">'utf8'</span>)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_json2</span><span class="params">(date,rk,CK,r)</span>:</span></span><br><span class="line"> <span class="string">'''根据构造出的url获取到航班数据'''</span></span><br><span class="line"> url=<span class="string">'http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=%s&IsNearAirportRecommond=0&rk=%s&CK=%s&r=%s'</span>%(date,rk,CK,r)</span><br><span class="line"> headers={<span class="string">'Host'</span>:<span class="string">"flights.ctrip.com"</span>,<span class="string">'User-Agent'</span>:<span class="string">"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"</span>,<span class="string">'Referer'</span>:<span class="string">"http://flights.ctrip.com/booking/hrb-sha-day-1.html?ddate1=2016-05-18"</span>}</span><br><span class="line"> headers[<span class="string">'Referer'</span>]=<span class="string">"http://flights.ctrip.com/booking/hrb-sha-day-1.html?ddate1=%s"</span>%date</span><br><span class="line"> req=urllib2.Request(url,headers=headers)</span><br><span class="line"> res=urllib2.urlopen(req)</span><br><span class="line"> content=res.read()</span><br><span class="line"> dict_content=json.loads(content,encoding=<span class="string">"gb2312"</span>)</span><br><span class="line"> <span class="keyword">print</span> len(dict_content[<span class="string">'fis'</span>]) </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_parameter</span><span class="params">(date)</span>:</span></span><br><span class="line"> <span class="string">'''获取重要的参数</span><br><span class="line"> date:日期,格式示例:2016-05-13</span><br><span class="line"> '''</span></span><br><span class="line"> url=<span class="string">'http://flights.ctrip.com/booking/hrb-sha-day-1.html?ddate1=%s'</span>%date</span><br><span class="line"> res=urllib2.urlopen(url).read()</span><br><span class="line"> tree=etree.HTML(res)</span><br><span class="line"> pp=tree.xpath(<span class="string">'''//body/script[1]/text()'''</span>)[<span class="number">0</span>].split()</span><br><span class="line"> CK_original=pp[<span class="number">3</span>][<span class="number">-34</span>:<span class="number">-2</span>]</span><br><span class="line"> CK=CK_original[<span class="number">0</span>:<span class="number">5</span>]+CK_original[<span class="number">13</span>]+CK_original[<span class="number">5</span>:<span class="number">13</span>]+CK_original[<span class="number">14</span>:]</span><br><span class="line"></span><br><span class="line"> rk=pp[<span class="number">-1</span>][<span class="number">18</span>:<span class="number">24</span>]</span><br><span class="line"> num=random.random()*<span class="number">10</span></span><br><span class="line"> num_str=<span class="string">"%.15f"</span>%num</span><br><span class="line"> rk=num_str+rk</span><br><span class="line"> r=pp[<span class="number">-1</span>][<span class="number">27</span>:len(pp[<span class="number">-1</span>])<span class="number">-3</span>]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> rk,CK,r</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> date=<span class="string">'2016-05-15'</span></span><br><span class="line"> rk,CK,r=get_parameter(date)</span><br><span class="line"> get_json2(date,rk,CK,r)</span><br></pre></td></tr></table></figure></p>
<p>执行结果<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">41</span><br></pre></td></tr></table></figure></p>
<p>在浏览器中搜索2016年5月15日的航班数确实是41条,如下图所示<br><img src="/2016/05/11/get-ctrip-flights-info-2/search_result.png" alt="浏览器中的搜索结果"></p>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>至此本次携程网机票信息抓取就告一段落了,上面提供了完整可运行的代码,可以一边参照本博客一边运行查看效果。当然如果想要支持任意两个地点的查询要先知道所有地点的英文缩写,可以把它存储在字典中;另外由于航班信息json数据比较大,用单线程读取效率比较低下,此时可以考虑使用多线程……还有很多可以完善的地方,这些内容就不在本文中展开了。<br><strong>注意事项</strong>:</p>
<ul>
<li>携程网站对于爬虫爬取的频率有限制,频率过高服务器会返回429错误,此时未登录用户将无法正确获取数据。因此建议登录账号后利用cookie进行数据的抓取,虽然登录后过于频繁也会导致429错误(我用Python开20个线程抓取不到10分钟就会出现此错误),但是只要等待3分钟后就可以继续爬取,而且爬取的数据不会出错(数据的正确性可以根据返回的json数据中的Error项来判断,Error代码为104说明数据出错)。</li>
<li>即便采用账号登录的形式,不到几个小时cookie就会失效,因而需要不断地更新cookie值。</li>
</ul>
<h3 id="上篇回顾"><a href="#上篇回顾" class="headerlink" title="上篇回	
用Python抓取携程网机票信息 过程纪实(上篇)
http://wenqiang-china.github.io/2016/05/10/get-ctrip-flights-info/
2016-05-10T08:40:37.542Z
2016-05-17T12:06:05.649Z
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>现在有一个需求,想查询一下给定出发地和目的地的机票数目,然后得到所需要的航班信息。不知道哪个网站比较好,于是用bing查了一下,搜索结果中第一个是携程在bing打的广告。<img src="/2016/05/10/get-ctrip-flights-info/flights_search_result.png" alt="bing搜索截图"><br>秉承着对bing搜索一贯的信任(<em>^__^</em>),我点开了携程机票查询的链接。<br><img src="/2016/05/10/get-ctrip-flights-info/search_ctrip.png" alt="ctrip机票查询"><br>在上图的左侧查询版块选择出发城市和目的城市后点击搜索按钮,会跳转到另一个页面,如下图所示<br><img src="/2016/05/10/get-ctrip-flights-info/携程网机票信息显示页面.png" alt="携程网机票信息"><br>这个页面的显示结果正是我们所需要的,上面有航班的数目和相应的信息,那么如何获取呢?</p>
<h3 id="页面分析"><a href="#页面分析" class="headerlink" title="页面分析"></a>页面分析</h3><h4 id="直接读取html文档吗?"><a href="#直接读取html文档吗?" class="headerlink" title="直接读取html文档吗?"></a>直接读取html文档吗?</h4><p>显然不行,这个页面的显示用到了Ajax的异步调用,直接查询html文档是获取不到数据的。话说回来要是这么容易就获取到了还犯得着写个博客记录一下吗:-D</p>
<h4 id="解析JavaScript代码?"><a href="#解析JavaScript代码?" class="headerlink" title="解析JavaScript代码?"></a>解析JavaScript代码?</h4><p>没错,JavaScript代码是迟早要进行解析的,不过不是现在(事实上要留到下篇博客)。现在我们要做的是对后台处理过程有个大体的认识,例如数据的格式,信息访问,而且标题说了用Python,那么还要考虑到怎样用Python处理得到的数据,以上这些是本博客接下来要做的内容,至于其他内容将在下篇博客中讲到。<br>我用的PC机,firefox浏览器,直接F12打开开发工具,切换到网络选项卡,然后重新载入页面,接下来会看到如下图所示的结果<br><img src="/2016/05/10/get-ctrip-flights-info/F12工具截图.png" alt="F12截图"><br>上面的图不用多介绍了,下面左侧显示的是网页加载过程中从服务器获取到的文件,右边是相应的内容信息。可以看到图中选中的文件是浏览器显示的主页面,然而这个主页面除了显示标题栏、菜单栏、页脚之外什么也没有,显然咱们要的信息不在这(想查看每个页面显示效果,在上图中<strong>先选中文件,然后在右侧选择“预览”选项,就可以看到页面的预览效果</strong>,上图右侧就是主页面的预览效果)。知道上面的技巧以后,就可以一边选择文件,一边预览页面,这样很快就可以定位到所需的网页文件。下图就是包含航班信息的网页文件<br><img src="/2016/05/10/get-ctrip-flights-info/包含航班信息的js文件.png" alt="包含航班信息的js文件"><br>在右侧的预览中可以看到航班数据,不过格式不够直观,将其切换到“响应”选项卡,如下图,返回的数据是json格式。<br><img src="/2016/05/10/get-ctrip-flights-info/响应选项卡.png" alt="响应选项卡查看"><br>在json数据中有一个”fis”对应0~38共39个对象,对应网页中显示的39个航班信息,如下图所示<br><img src="/2016/05/10/get-ctrip-flights-info/fis截图.png" alt=""><br>有些城市直接不存在直达的航班,而是需要中转换乘,这种航班信息显示在“tf”中,如下图所示<br><img src="/2016/05/10/get-ctrip-flights-info/tf_array.png" alt=""><br>每个object里面包含该航班的具体信息,下图是打开第一个object看到的内容<br><img src="/2016/05/10/get-ctrip-flights-info/object查看.png" alt=""><br>里面包含了页面展示所涉及到的全部数据信息,下面是其中的一部分<br><img src="/2016/05/10/get-ctrip-flights-info/object航班信息.png" alt=""><br><img src="/2016/05/10/get-ctrip-flights-info/object航班信息(二).png" alt=""><br>尤其需要留意的是json文件最下面的Error项,对于正常的json Eoor项是为null的,如果查询的城市之间无直飞航班,则Error 中会包含Code项,值为102;如果查询的两城市之间并不通航,则Error 中同样包含Code项,值为103;最糟糕的是Code值为104,它表明json数据是错的。如下图<br><img src="/2016/05/10/get-ctrip-flights-info/ErrorCode.png" alt=""></p>
<h3 id="编写爬虫"><a href="#编写爬虫" class="headerlink" title="编写爬虫"></a>编写爬虫</h3><p>上面已经找到了包含数据的js代码,假如我们想要获取航班的数量信息(类似于上文的39)那么我们在Python中直接访问该url获取资源岂不美哉!然并卵,直接用是不行的。下面的示例代码完成对js对应url的访问,并对response页面进行了显示。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_that</span><span class="params">()</span>:</span></span><br><span class="line"> </span><br><span class="line"> url=<span class="string">'http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&rk=5.189667156909168071745&CK=89D3A4A3A5F8A7F7E48ACDD1F451127A&r=0.1440474125154478474718'</span></span><br><span class="line"></span><br><span class="line"> response=urllib2.urlopen(url).read()</span><br><span class="line"> <span class="keyword">print</span> response</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> get_that()</span><br></pre></td></tr></table></figure></p>
<p>运行结果<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">"lps"</span>:{},<span class="string">"fis"</span>:[],<span class="string">"islpc"</span>:true,<span class="string">"tf"</span>:null,<span class="string">"sf"</span>:null,<span class="string">"rflag"</span>:{<span class="string">"rn"</span>:false,<span class="string">"rt"</span>:false,<span class="string">"rht"</span>:false,<span class="string">"rtp"</span>:false,<span class="string">"fquery"</span>:true},<span class="string">"lp"</span>:<span class="number">0</span>,<span class="string">"lcfp"</span>:<span class="number">0</span>,<span class="string">"lr"</span>:<span class="number">0</span>,<span class="string">"rpl"</span>:null,<span class="string">"icfnf"</span>:false,<span class="string">"al"</span>:[],<span class="string">"iaw"</span>:false,<span class="string">"atc"</span>:<span class="number">0</span>,<span class="string">"abc"</span>:<span class="number">0</span>,<span class="string">"hmat"</span>:false,<span class="string">"hmab"</span>:false,<span class="string">"pc"</span>:<span class="number">0</span>,<span class="string">"latp"</span>:<span class="number">0</span>,<span class="string">"latdt"</span>:<span class="string">"0001-01-01 00:00:00"</span>,<span class="string">"gpl"</span>:null,<span class="string">"rlp"</span>:null,<span class="string">"rrc"</span>:<span class="number">0</span>,<span class="string">"rtgt"</span>:null,<span class="string">"nnrr"</span>:<span class="number">0</span>,<span class="string">"airfreq"</span>:null,<span class="string">"apb"</span>:{},<span class="string">"als"</span>:{},<span class="string">"fcts"</span>:[],<span class="string">"ibc"</span>:{},<span class="string">"TraceLog"</span>:null,<span class="string">"Error"</span>:{<span class="string">"Code"</span>:<span class="number">104</span>,<span class="string">"Message"</span>:<span class="string">""</span>,<span class="string">"Data"</span>:<span class="string">""</span>}}</span><br></pre></td></tr></table></figure></p>
<p>没有得到我们想要的数据。error信息中错误代码为104,下篇博客会谈到这个104是怎么来的。从结果看携程的服务器对request的消息头进行了验证,贸然访问不行,那就需要伪装一下了。下面代码演示了用设置了请求头的request访问刚才的网址,然后将json格式转换成Python中的dict类型,并且将其中”fis”关键字对应的值的数目打印出来。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_json</span><span class="params">()</span>:</span></span><br><span class="line"> url=<span class="string">'http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=HRB&ACity1=SHA&SearchType=S&DDate1=2016-05-13&IsNearAirportRecommond=0&rk=5.189667156909168071745&CK=89D3A4A3A5F8A7F7E48ACDD1F451127A&r=0.1440474125154478474718'</span></span><br><span class="line"> headers={<span class="string">'Host'</span>:<span class="string">"flights.ctrip.com"</span>,<span class="string">'User-Agent'</span>:<span class="string">"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"</span>,<span class="string">'Referer'</span>:<span class="string">"http://flights.ctrip.com/booking/hrb-sha-day-1.html?ddate1=2016-05-13"</span>}</span><br><span class="line"> req=urllib2.Request(url,headers=headers)</span><br><span class="line"> res=urllib2.urlopen(req)</span><br><span class="line"> content=res.read()</span><br><span class="line"> dict_content=json.loads(content,encoding=<span class="string">"gb2312"</span>)</span><br><span class="line"> <span class="keyword">print</span> len(dict_content[<span class="string">'fis'</span>])</span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">'__main__'</span>:</span><br><span class="line"> get_json()</span><br></pre></td></tr></table></figure></p>
<p>上面代码中用到了urllib2模块和json模块,前者用于网络资源的访问,后者用于解析json格式。由于携程网网页的字符编码格式为gb-2312,所以掉用json的loads方法时需要指定字符集为gb-2312。下面是得到的结果<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">39</span></span><br></pre></td></tr></table></figure></p>
<p>终于得到了我们想要的结果。这里就不对航班中的其他信息进行提取了,实际上提取的方式是一样的,通过将json格式转换为dict,访问其中的某个键值就变得很轻松了。</p>
<h3 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h3><p>至此,本文就告一段落了,本文主要谈到了如何快速定位到所需的js文件,以及构造headers,最后将json格式转换为dict格式方便对数据的操作。但问题到这里还没有结束,我们想要实现的是给定出发地、到达地和出发时间,得到航班数量,然而现在包含数据的js文件是手动设置的,作为一个爬虫,显然这里需要修改。观察url的格式,里面除了我们提供的出发城市(DCity)、目的城市(ACity)、单程(SearchType=S)、日期(DDate)和IsNearAirportRecommond之外,还有三个很重要的参数(rk、CK、r),想要构造出这三个参数,就需要看js代码了,下篇博客会详细介绍js代码中这三个参数的“前世今生”,一起<a href="http://wenqiang-china.github.io/2016/05/11/get-ctrip-flights-info-2/">探索吧</a>!</p>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>现ղ
Python函数
http://wenqiang-china.github.io/2016/05/02/python-functions/
2016-05-02T02:54:44.262Z
2016-05-03T15:26:14.800Z
<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>Python中的函数作为Python中的一个类对象,功能强大,灵活度高。本文从函数基本属性入手,谈一谈Python中的函数</p>
<h3 id="Python函数的基本属性"><a href="#Python函数的基本属性" class="headerlink" title="Python函数的基本属性"></a>Python函数的基本属性</h3><p>Python中函数的属性可以使用dir函数进行查看,例如对于下面定义的cubic函数<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">cubic</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="string">"""return cubic of given number"""</span></span><br><span class="line"> <span class="keyword">return</span> x**<span class="number">3</span></span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>cubic</span><br><span class="line"><function cubic at <span class="number">0x0000000002E23F98</span>></span><br><span class="line"><span class="meta">>>> </span>dir(cubic)</span><br><span class="line">[<span class="string">'__call__'</span>, <span class="string">'__class__'</span>, <span class="string">'__closure__'</span>, <span class="string">'__code__'</span>, <span class="string">'__defaults__'</span>, <span class="string">'__delattr__'</span>, <span class="string">'__dict__'</span>, <span class="string">'__doc__'</span>, <span class="string">'__format__'</span>, <span class="string">'__get__'</span>, <span class="string">'__getattribute__'</span>, <span class="string">'__globals__'</span>, <span class="string">'__hash__'</span>, <span class="string">'__init__'</span>, <span class="string">'__module__'</span>, <span class="string">'__name__'</span>, <span class="string">'__new__'</span>, <span class="string">'__reduce__'</span>, <span class="string">'__reduce_ex__'</span>, <span class="string">'__repr__'</span>, <span class="string">'__setattr__'</span>, <span class="string">'__sizeof__'</span>, <span class="string">'__str__'</span>, <span class="string">'__subclasshook__'</span>, <span class="string">'func_closure'</span>, <span class="string">'func_code'</span>, <span class="string">'func_defaults'</span>, <span class="string">'func_dict'</span>, <span class="string">'func_doc'</span>, <span class="string">'func_globals'</span>, <span class="string">'func_name'</span>]</span><br></pre></td></tr></table></figure></p>
<p>上面列出了cubic函数所有的属性,下面谈几个重要的属性</p>
<h4 id="doc-返回制定函数的文档字符串"><a href="#doc-返回制定函数的文档字符串" class="headerlink" title="__doc__ :返回制定函数的文档字符串"></a>__doc__ :返回制定函数的文档字符串</h4><p>对于上面的cubic函数,查看它的<strong>doc</strong>属性如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic.__doc__</span><br><span class="line"><span class="string">'return cubic of x'</span></span><br></pre></td></tr></table></figure></p>
<h4 id="module-返回函数所在模块的名字"><a href="#module-返回函数所在模块的名字" class="headerlink" title="__module__ :返回函数所在模块的名字"></a>__module__ :返回函数所在模块的名字</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic.__module__</span><br><span class="line"><span class="string">'__main__'</span></span><br></pre></td></tr></table></figure>
<h4 id="name-返回函数的名字"><a href="#name-返回函数的名字" class="headerlink" title="__name__ :返回函数的名字"></a>__name__ :返回函数的名字</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic.__name__</span><br><span class="line"><span class="string">'cubic'</span></span><br></pre></td></tr></table></figure>
<h4 id="func-globals-返回一个包含函数全局变量的字典引用"><a href="#func-globals-返回一个包含函数全局变量的字典引用" class="headerlink" title="func_globals:返回一个包含函数全局变量的字典引用"></a>func_globals:返回一个包含函数全局变量的字典引用</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic.func_globals</span><br><span class="line">{<span class="string">'__builtins__'</span>: <module <span class="string">'__builtin__'</span> (built-<span class="keyword">in</span>)>, <span class="string">'__name__'</span>: <span class="string">'__main__'</span>, <span class="string">'cubic'</span>: <function cubic at <span class="number">0x0000000002E23EB8</span>>, <span class="string">'__doc__'</span>: <span class="keyword">None</span>, <span class="string">'__package__'</span>: <span class="keyword">None</span>}</span><br></pre></td></tr></table></figure>
<h4 id="func-defaults-返回一个包含默认参数值的元组"><a href="#func-defaults-返回一个包含默认参数值的元组" class="headerlink" title="func_defaults:返回一个包含默认参数值的元组"></a>func_defaults:返回一个包含默认参数值的元组</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic.func_defaults</span><br><span class="line">>>></span><br></pre></td></tr></table></figure>
<p>上面没有显示任何信息,因为cubic函数不包含默认参数,后面再详细讨论该属性</p>
<h4 id="func-closure-返回一个胞体元组,胞体中包含了对函数自由变量的绑定,这属于闭包的范畴"><a href="#func-closure-返回一个胞体元组,胞体中包含了对函数自由变量的绑定,这属于闭包的范畴" class="headerlink" title="func_closure: 返回一个胞体元组,胞体中包含了对函数自由变量的绑定,这属于闭包的范畴"></a>func_closure: 返回一个胞体元组,胞体中包含了对函数自由变量的绑定,这属于闭包的范畴</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>cubic.func_closure</span><br><span class="line">>>></span><br></pre></td></tr></table></figure>
<p>可以看到,上面的例子过于简单,也没有涉及到闭包,后面详细探讨</p>
<h3 id="函数迭代"><a href="#函数迭代" class="headerlink" title="函数迭代"></a>函数迭代</h3><p>函数可以作为参数传递给其他函数,以其他函数作为参数的函数成为高阶函数,在Python中有一些自带的函数就具有这样的特点。如map函数,map函数接受一个函数和一个可迭代对象作为它的参数,将函数应用于迭代对象中的每一项,并将作用后的迭代对象作为列表返回。例如还以前面举的cubic函数为例,看一下map函数的作用结果<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>map(cubic,range(<span class="number">12</span>))</span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">8</span>, <span class="number">27</span>, <span class="number">64</span>, <span class="number">125</span>, <span class="number">216</span>, <span class="number">343</span>, <span class="number">512</span>, <span class="number">729</span>, <span class="number">1000</span>, <span class="number">1331</span>]</span><br></pre></td></tr></table></figure></p>
<h3 id="函数嵌套定义"><a href="#函数嵌套定义" class="headerlink" title="函数嵌套定义"></a>函数嵌套定义</h3><p>可以在函数的内部定义函数,也可以将函数赋值给变量,下面的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">outer</span><span class="params">()</span>:</span></span><br><span class="line"> outer_var=<span class="string">"in outer function"</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">inner</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">return</span> outer_var</span><br><span class="line"> <span class="keyword">return</span> inner</span><br><span class="line"><span class="meta">>>> </span>function=outer()</span><br><span class="line"><span class="meta">>>> </span>function</span><br><span class="line"><function inner at <span class="number">0x0000000002E23B38</span>></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>上面的例子中,外层函数返回内部函数并将其赋值给变量,现在function所引用的是内部函数的一个实例对象。可以像调用普通函数一样调用它,例如下面:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>function()</span><br><span class="line"><span class="string">'in outer function '</span></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>可以正确调用inner函数</p>
<h3 id="函数的定义"><a href="#函数的定义" class="headerlink" title="函数的定义"></a>函数的定义</h3><p>函数定义的执行会绑定当前本地名称空间中的函数名到一个函数对象,该对象是一个对函数中可执行代码的包装器。该对象包含了一个对全局名称空间(有别于当前名称空间,后者是该函数调用的全局名称空间)的引用,函数只有在调用时才会真正执行</p>
<h3 id="函数的参数"><a href="#函数的参数" class="headerlink" title="函数的参数"></a>函数的参数</h3><p>Python中的函数支持固定参数和可变参数,后者可以是列表、字典或者其他迭代对象。</p>
<h4 id="默认参数"><a href="#默认参数" class="headerlink" title="默认参数"></a>默认参数</h4><p>使用默认参数时,用户可以省去一些重复输入,同时代码本身健壮性可以显著增强。下面是一个函数默认参数的函数的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">repeat</span><span class="params">(str,times=<span class="number">3</span>)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> str*times</span><br><span class="line"><span class="meta">>>> </span>repeat(<span class="string">"haha"</span>)</span><br><span class="line">hahahahahaha</span><br><span class="line"><span class="meta">>>> </span>repeat(<span class="string">"haha"</span>,<span class="number">5</span>)</span><br><span class="line">hahahahahahahahahaha</span><br></pre></td></tr></table></figure></p>
<p>可以看到,当没有给times传入值时,就会使用默认的参数值;而当指定times值之后,就会使用指定值。</p>
<p><strong>注意</strong>:当默认参数为可变参数时要格外小心,由于函数定义只执行一次,因此相同的可变结构会用于后续所有的函数调用中。例如<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">mutable_show</span><span class="params">(args,default_args=[])</span>:</span></span><br><span class="line"> default_args.append(args)</span><br><span class="line"> <span class="keyword">print</span> <span class="string">"default_args:{}"</span>.format(default_args)</span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>mutable_show(<span class="string">"once"</span>)</span><br><span class="line">default_args:[<span class="string">'once'</span>]</span><br><span class="line"><span class="meta">>>> </span>mutable_show(<span class="string">"twice"</span>)</span><br><span class="line">default_args:[<span class="string">'once'</span>, <span class="string">'twice'</span>]</span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>上面的代码中两次输入的args被先后加到了default_args中,所以使用可变就够作为默认参数时要小心出错。</p>
<h4 id="关键字参数"><a href="#关键字参数" class="headerlink" title="关键字参数"></a>关键字参数</h4><p>采用”arg=value”的形式<strong>调用函数</strong>称之为关键词参数,注意这里指的是调用的时候采用”arg=value”的形式而非”value”这样的形式。<br>例如对于上面的repeat函数中,可以采用下面的集中方法来调用该函数<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>repeat(str=<span class="string">"hehe"</span>)</span><br><span class="line">hehehehehehe</span><br><span class="line"><span class="meta">>>> </span>repeat(times=<span class="number">5</span>,str=<span class="string">"heihei"</span>)</span><br><span class="line">heiheiheiheiheiheiheiheiheihei</span><br><span class="line"><span class="meta">>>> </span>repeat(str=<span class="string">"heihei"</span>,times=<span class="number">5</span>)</span><br><span class="line">heiheiheiheiheiheiheiheiheihei</span><br></pre></td></tr></table></figure></p>
<p>上面代码中第一个参数使用了关键字参数的方式,第二个参数采用默认参数值,函数正确执行。第二个和第三个参数顺序颠倒但是都可以正确执行,说明关键字参数的先后顺序不影响函数执行。但要注意关键字参数不能放在非关键字参数的前面,例如下面的方式就会出错<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>repeat(str=<span class="string">"heihei"</span>,<span class="number">5</span>)</span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">1</span></span><br><span class="line">SyntaxError: non-keyword arg after keyword arg</span><br></pre></td></tr></table></figure></p>
<p>上面的第二个参数是非关键字参数,它必须放在关键字参数的前面。但是如果改成下面这样也是不对的。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>repeat(<span class="number">5</span>,str=<span class="string">"heiheihei"</span>)</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">1</span>, <span class="keyword">in</span> <module></span><br><span class="line">TypeError: repeat() got multiple values <span class="keyword">for</span> keyword argument <span class="string">'str'</span></span><br></pre></td></tr></table></figure></p>
<p>因为按照函数参数匹配的方式,第一个参数5被复制给形参str(专业的说法是:这里的5是位置参数,会被赋值给相应位置的形参),而后面再次给str赋值,给同一个参数多次赋值是不可以的。</p>
<h4 id="任意的参数列表"><a href="#任意的参数列表" class="headerlink" title="任意的参数列表"></a>任意的参数列表</h4><p>Python中函数可以接受以元组形式传递的任意数量的参数,下面是一个相应的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">mutable_show</span><span class="params">(separator,*args)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> separator.join(args)</span><br><span class="line"><span class="meta">>>> </span>mutable_show(<span class="string">""</span>,<span class="string">'haha'</span>,<span class="string">'hehe'</span>,<span class="string">'heihei'</span>)</span><br><span class="line">hahaheheheihei</span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>上面的’haha’,’hehe’,’heihei’被捆绑为一个元组,可以通过args访问该元组。</p>
<h3 id="解包函数参数"><a href="#解包函数参数" class="headerlink" title="解包函数参数"></a>解包函数参数</h3><p>函数调用的参数可以是元组、列表或者字典,这是需要使用*或者**将这些参数解包到函数内部。首先看一个基本的例子:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">print_args</span><span class="params">(a,b,c)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> a</span><br><span class="line"> <span class="keyword">print</span> b</span><br><span class="line"> <span class="keyword">print</span> c</span><br><span class="line"><span class="meta">>>> </span>print_args(<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure></p>
<p>如果参数本来就在一个list中,可以将list作为参数传递进去,像下面这样:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>a=range(<span class="number">1</span>,<span class="number">4</span>)</span><br><span class="line"><span class="meta">>>> </span>print_args(*a)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure></p>
<p>类似的,对于字典形式的参数可以使用**的方式传递给函数,像下面的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">print_dict</span><span class="params">(var1,var2,var3=<span class="string">"hehe"</span>)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> var2,var3,var1</span><br><span class="line"><span class="meta">>>> </span>d={<span class="string">'var1'</span>:<span class="string">"wenqiang"</span>,<span class="string">"var2"</span>:<span class="string">"My name "</span>,<span class="string">"var3"</span>:<span class="string">"is "</span>}</span><br><span class="line"><span class="meta">>>> </span>print_dict(**d)</span><br><span class="line">My name <span class="keyword">is</span> wenqiang</span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<h3 id="和-应用场景:参数个数不定时"><a href="#和-应用场景:参数个数不定时" class="headerlink" title="*和**应用场景:参数个数不定时"></a>*和**应用场景:参数个数不定时</h3><p>有的时候不知道调用的时候参数的个数,这时可以使用*和**作为参数。<br>对于下面的形式<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print_args(arg,*args,**kwargs)</span><br></pre></td></tr></table></figure></p>
<p>后面的args和kwargs是可选的,但要注意函数定义时*args必须位于**kwargs的前面<br>下面是一个使用的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">print_args</span><span class="params">(arg,*args,**kwargs)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> arg</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> args:</span><br><span class="line"> <span class="keyword">print</span> args</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> kwargs:</span><br><span class="line"> <span class="keyword">print</span> item,kwargs[item]</span><br><span class="line"><span class="meta">>>> </span>args=range(<span class="number">1</span>,<span class="number">6</span>)</span><br><span class="line"><span class="meta">>>> </span>kwargs={<span class="string">'name'</span>:<span class="string">"program"</span>,<span class="string">'language'</span>:<span class="string">"Python"</span>,<span class="string">'content'</span>:<span class="string">"function"</span>}</span><br><span class="line"><span class="meta">>>> </span>print_args(<span class="string">"test"</span>,*args,**kwargs)</span><br><span class="line">test</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>)</span><br><span class="line">content function</span><br><span class="line">name program</span><br><span class="line">language Python</span><br></pre></td></tr></table></figure></p>
<h3 id="匿名函数"><a href="#匿名函数" class="headerlink" title="匿名函数"></a>匿名函数</h3><p>可以使用lambda创建匿名函数,lambda表达式返回函数对象,该函数可以想普通函数一样被调用,见下面的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">>>>cubic=<span class="keyword">lambda</span> x: x**<span class="number">3</span></span><br><span class="line"><span class="meta">>>> </span><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line"><span class="meta">... </span> cubic(i)</span><br><span class="line">...</span><br><span class="line"><span class="number">0</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">8</span></span><br><span class="line"><span class="number">27</span></span><br><span class="line"><span class="number">64</span></span><br><span class="line"><span class="number">125</span></span><br><span class="line"><span class="number">216</span></span><br><span class="line"><span class="number">343</span></span><br><span class="line"><span class="number">512</span></span><br><span class="line"><span class="number">729</span></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<h3 id="函数的嵌套和闭包"><a href="#函数的嵌套和闭包" class="headerlink" title="函数的嵌套和闭包"></a>函数的嵌套和闭包</h3><p>在函数内部定义函数形成了函数的嵌套,像前面的例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">outer</span><span class="params">()</span>:</span></span><br><span class="line"> outer_var=<span class="string">"in outer function"</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">inner</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">return</span> outer_var</span><br><span class="line"> <span class="keyword">return</span> inner</span><br></pre></td></tr></table></figure></p>
<p>每次调用外部函数时,都会创建一个内部函数的实例并返回到外部(原本inner函数作用域只在outer函数内部,通过返回内部函数inner可以在其他地方调用该函数),因为每次执行调用代码时inner函数都执行函数定义,但不会执行其函数体,只有当调用inner函数时函数体才会执行。<br>inner函数可以访问outer函数的变量,这是Python允许的操作,像之前举的例子,inner函数调用后会返回outer函数中定义的变量。对于嵌套函数,当内部函数引用外部函数的变量时,我们认为嵌套函数相对于引用变量是封闭的。对于这种情形,我们可以使用函数属性__closure__来访问该变量,如下所示:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>a=outer()</span><br><span class="line"><span class="meta">>>> </span>a</span><br><span class="line"><function inner at <span class="number">0x0000000002E23EB8</span>></span><br><span class="line"><span class="meta">>>> </span>va=a.__closure__</span><br><span class="line"><span class="meta">>>> </span>va</span><br><span class="line">(<cell at <span class="number">0x0000000002E3E948</span>: str object at <span class="number">0x0000000002E4F030</span>>,)</span><br><span class="line"><span class="meta">>>> </span>va[<span class="number">0</span>].cell_contents</span><br><span class="line"><span class="string">'in outer function '</span></span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>上面的例子中,使用__closure__属性得到的是一个包含全部闭包变量的元组,使用cell_contents方法可以查看变量的值</p>
<p><strong>注意:Python 3之前的版本中指向不可变类型的变量无法在闭包中反弹</strong>。下面的例子:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">counter</span><span class="params">()</span>:</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">c</span><span class="params">()</span>:</span></span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> count</span><br><span class="line"> <span class="keyword">return</span> c</span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>a=counter()</span><br><span class="line"><span class="meta">>>> </span>a()</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">1</span>, <span class="keyword">in</span> <module></span><br><span class="line"> File <span class="string">"<stdin>"</span>, line <span class="number">4</span>, <span class="keyword">in</span> c</span><br><span class="line">UnboundLocalError: local variable <span class="string">'count'</span> referenced before assignment</span><br><span class="line">>>></span><br></pre></td></tr></table></figure></p>
<p>一种解决办法是用可变类型代替上面的变量,例如:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">counter</span><span class="params">()</span>:</span></span><br><span class="line"> count = [<span class="number">0</span>]</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">c</span><span class="params">()</span>:</span></span><br><span class="line"> count[<span class="number">0</span>]+= <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> count[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">return</span> c</span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>a=counter()</span><br><span class="line"><span class="meta">>>> </span>a()</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="meta">>>> </span>a()</span><br><span class="line"><span class="number">2</span></span><br></pre></td></tr></table></figure></p>
<p>在Python 3中引入了nonlocal关键字解决了上面的问题,在Python 3中可以如下定义:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">counter</span><span class="params">()</span>:</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">c</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">nonlocal</span> count</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> count</span><br><span class="line"> <span class="keyword">return</span> c</span><br></pre></td></tr></table></figure></p>
<h3 id="内建函数-apply-filter-map-reduce"><a href="#内建函数-apply-filter-map-reduce" class="headerlink" title="内建函数 apply() filter() map() reduce()"></a>内建函数 apply() filter() map() reduce()</h3><p>这些函数实现了函数式编程语言中的一些功能结合lambda表示式可以用很精简的代码完成很丰富的功能。这里只简要的提一下,后面会有专门的博文讲述这几个函数。</p>
<h4 id="apply-函数"><a href="#apply-函数" class="headerlink" title="apply()函数"></a>apply()函数</h4><p>函数完整的定义如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apply(func[,nkw][,kw])</span><br></pre></td></tr></table></figure></p>
<p>其中第一个参数是一个函数,第二个可选参数为非关键字参数,第三个可选参数为关键字参数。apply的返回值是func执行后的返回值。说的直白一些就是相当于func([nkw][,kw])因此使用这个函数未必会简化代码量,所以在1.6之后的版本中已经不推荐使用,《Python核心编程》中说这个函数会逐步淘汰掉。<br>下面举个例子对比一下用和不用这个函数的效果<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">repeat</span><span class="params">(str,times)</span>:</span></span><br><span class="line"> <span class="keyword">print</span> str*times</span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>repeat(<span class="string">"hehe"</span>,times=<span class="number">6</span>)</span><br><span class="line">hehehehehehehehehehehehe</span><br><span class="line"><span class="meta">>>> </span>apply(repeat,(<span class="string">"hehe"</span>,),{<span class="string">"times"</span>:<span class="number">6</span>})</span><br><span class="line">hehehehehehehehehehehehe</span><br></pre></td></tr></table></figure></p>
<p>上面用两种方式对repeat函数进行了相同目的的调用,第一种是常规的函数调用形式,传入的第一个参数是位置参数,第二个是关键字参数,调用格式简洁明了;第二种方式采用apply函数的形式,第一个参数是函数名,第二个参数是位置参数,这里需要以元组的形式传入,第三个参数是关键字参数,传入的关键字参数要以字典的形式传进来。可以看到利用apply反而会使问题变得更加复杂和繁琐。</p>
<h4 id="filter函数"><a href="#filter函数" class="headerlink" title="filter函数"></a>filter函数</h4><p>filter函数的定义形式如下<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">filter(func,seq)</span><br></pre></td></tr></table></figure></p>
<p>func是一个布尔函数,即返回值为bool值(True或者False);seq是一个序列。filter函数会将seq中的每个元素作为参数传进func函数中,并且将func返回值为True的元素加进最终要返回的序列中,最终返回由所有满足func返回值为True的元素组成的序列。<br>下面举一个例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">func</span><span class="params">(num)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> num%<span class="number">2</span>==<span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>filter(func,range(<span class="number">10</span>))</span><br><span class="line">[<span class="number">0</span>, <span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>]</span><br></pre></td></tr></table></figure></p>
<p>上面定义的函数当num为偶数时返回True,否则返回false。通过filter调用,最终返回使得func值为True的所有元素,即序列中所有的偶数。其实在Python中引入list comprehension后利用list comprehension的特性来实现这种功能同样十分轻松,甚至后者更为便捷。假如想用list comprehension来实现这样的功能,只需要像下面这样</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>[i <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>) <span class="keyword">if</span> i%<span class="number">2</span>==<span class="number">0</span>]</span><br><span class="line">[<span class="number">0</span>, <span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>]</span><br></pre></td></tr></table></figure>
<p>所以自从引入了列表推导后,函数式编程的函数的作用就变小了。</p>
<h4 id="map函数"><a href="#map函数" class="headerlink" title="map函数"></a>map函数</h4><p>map函数的定义如下<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">map(func,seq1[,seq2...])</span><br></pre></td></tr></table></figure></p>
<p>如果seq只有一个,则map函数的功能是把seq中的每个元素逐一代入到func中,并将作用后的结果以列表的形式返回。当seq不止一个时,即参数为seq1,seq2,……,此时map的操作是将seq1和seq2,……中对应位置的元素提取出来供func调用,并将调用后的结果加入到返回值列表。例如有两个序列,那么首先各取出第一个元素,seq1[0]和seq2[0],并将这两个值作为参数注入到函数func中,得到一个结果,放到结果列表中,然后再取seq1[1]和seq2[1],这样一直进行到两个序列元素都迭代过为止。如果两个序列长度不同,则较短的序列会用None值补全。下面举一个例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">func</span><span class="params">(x,y)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> y**x</span><br><span class="line"></span><br><span class="line"><span class="meta">>>> </span>map(func,range(<span class="number">10</span>),range(<span class="number">15</span>,<span class="number">25</span>))</span><br><span class="line">[<span class="number">1</span>, <span class="number">16</span>, <span class="number">289</span>, <span class="number">5832</span>, <span class="number">130321</span>, <span class="number">3200000</span>, <span class="number">85766121</span>, <span class="number">2494357888L</span>, <span class="number">78310985281L</span>, <span class="number">2641807540224L</span>]</span><br></pre></td></tr></table></figure></p>
<p>如果func为None(注意map里的func必须明确指定,可以明确指定为None),那么map此时的作用和zip很像,都是将后面的序列按位置匹配到元组中,不过zip会以序列中长度最短的为准,一旦有序列到末位,迭代就结束了。看下面的代码演示<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span>map(<span class="keyword">None</span>,range(<span class="number">10</span>),range(<span class="number">15</span>,<span class="number">25</span>))</span><br><span class="line">[(<span class="number">0</span>, <span class="number">15</span>), (<span class="number">1</span>, <span class="number">16</span>), (<span class="number">2</span>, <span class="number">17</span>), (<span class="number">3</span>, <span class="number">18</span>), (<span class="number">4</span>, <span class="number">19</span>), (<span class="number">5</span>, <span class="number">20</span>), (<span class="number">6</span>, <span class="number">21</span>), (<span class="number">7</span>, <span class="number">22</span>), (<span class="number">8</span>, <span class="number">23</span>), (<span class="number">9</span>, <span class="number">24</span>)]</span><br><span class="line"><span class="meta">>>> </span>map(<span class="keyword">None</span>,range(<span class="number">10</span>),range(<span class="number">15</span>,<span class="number">26</span>))</span><br><span class="line">[(<span class="number">0</span>, <span class="number">15</span>), (<span class="number">1</span>, <span class="number">16</span>), (<span class="number">2</span>, <span class="number">17</span>), (<span class="number">3</span>, <span class="number">18</span>), (<span class="number">4</span>, <span class="number">19</span>), (<span class="number">5</span>, <span class="number">20</span>), (<span class="number">6</span>, <span class="number">21</span>), (<span class="number">7</span>, <span class="number">22</span>), (<span class="number">8</span>, <span class="number">23</span>), (<span class="number">9</span>, <span class="number">24</span>), (<span class="keyword">None</span>, <span class="number">25</span>)]</span><br><span class="line"><span class="meta">>>> </span>zip(range(<span class="number">10</span>),range(<span class="number">15</span>,<span class="number">26</span>))</span><br><span class="line">[(<span class="number">0</span>, <span class="number">15</span>), (<span class="number">1</span>, <span class="number">16</span>), (<span class="number">2</span>, <span class="number">17</span>), (<span class="number">3</span>, <span class="number">18</span>), (<span class="number">4</span>, <span class="number">19</span>), (<span class="number">5</span>, <span class="number">20</span>), (<span class="number">6</span>, <span class="number">21</span>), (<span class="number">7</span>, <span class="number">22</span>), (<span class="number">8</span>, <span class="number">23</span>), (<span class="number">9</span>, <span class="number">24</span>)]</span><br></pre></td></tr></table></figure></p>
<p>可以看到如果后面的序列长度相同且func为None,则map函数作用和zip完全相同。</p>
<h4 id="reduce函数"><a href="#reduce函数" class="headerlink" title="reduce函数"></a>reduce函数</h4><p>reduce函数定义如下<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">reduce(func,seq[,init])</span><br></pre></td></tr></table></figure></p>
<p>func一定要是个二元函数(即接收两个参数),seq为输入序列,这里面的init是可选的。如果没有提供init参数,reduce的作用过程是,首先将seq中的前两个元素代入到函数func中,将函数的返回值和seq中的第三个元素作为参数如果到func中,再将执行后函数的返回结果和seq中的第四个元素作为参数传入到函数func中……依此类推,直到将序列迭代完。如果提供了init参数,reduce作用的区别仅在于初始时将seq中的第一个元素和init作为参数传入到func中,而不是seq的前两个元素,后面的操作完全相同。下面举个例子<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">multi</span><span class="params">(x,y)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> x*y</span><br><span class="line"><span class="meta">>>> </span>reduce(multi,range(<span class="number">1</span>,<span class="number">7</span>))</span><br><span class="line"><span class="number">720</span></span><br></pre></td></tr></table></figure></p>
<p>上面的例子中没有指定初始化参数,因此函数作用过程是先把序列中的前两个元素(1和2)作为参数传入到函数multi中,返回值2和序列的下一个元素3作为参数再传入multi中,得到6……依此类推得到720。</p>
<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>Python中
《高级数据库系统》笔记—— 第九章 并发控制
http://wenqiang-china.github.io/2016/05/01/adb-note-chapter9/
2016-05-01T04:13:10.086Z
2016-05-01T14:43:14.058Z
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回到上一章"></a><a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter8/">回到上一章</a></h4><h3 id="并发控制"><a href="#并发控制" class="headerlink" title="并发控制"></a>并发控制</h3><p>保证<strong>并发执行</strong>的事务能<strong>保持一致性</strong>的整个过程</p>
<h3 id="串行调度和可串行化调度"><a href="#串行调度和可串行化调度" class="headerlink" title="串行调度和可串行化调度"></a>串行调度和可串行化调度</h3><p>调度</p>
<ul>
<li>调度是一个或多个事务的重要操作按时间排序的一个序列</li>
<li>如READ, WRITE序列</li>
</ul>
<p>串行调度</p>
<ul>
<li>如果一个调度的动作组成首先是一个事务的所有动作,然后是另一个事务的所有功作,依此类推、而没有动作的混合,则该调度为串行调 度</li>
<li>更精确地讲,已知调度S中的任意两个事务T和T’,若T的某个动作在T’的某个动作前,则T的所有动作在T’的所有动作前,那么调度S是 串行的</li>
</ul>
<p><img src="/2016/05/01/adb-note-chapter9/串行调度举例.png" alt="串行调度举例"></p>
<p>可串行化调度</p>
<ul>
<li>如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,则该调度是可串行化的</li>
</ul>
<p>下图是一个可串行化的调度<br><img src="/2016/05/01/adb-note-chapter9/可串行调度变化前.png" alt="串行调度变化前"> <img src="/2016/05/01/adb-note-chapter9/可串行调度变化后.png" alt="串行调度变化后"></p>
<h4 id="事务和调度的一种记法"><a href="#事务和调度的一种记法" class="headerlink" title="事务和调度的一种记法"></a>事务和调度的一种记法</h4><ul>
<li>只考虑事务的读写操作</li>
<li>用ri(X)、wi(X)表示事务Ti读和写数据库元素X<br><img src="/2016/05/01/adb-note-chapter9/用r.和w表示事务和对数据库元素的修改.png" alt="用r.和w表示事务和对数据库元素的修改"></li>
</ul>
<ul>
<li>事务集合T的调度S是组成它的事务动作的一个交错的序列,</li>
</ul>
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回
《高级数据库系统》笔记—— 第八章 日志与故障恢复
http://wenqiang-china.github.io/2016/05/01/adb-note-chapter8/
2016-05-01T04:11:18.777Z
2016-05-01T14:31:14.992Z
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回到上一章"></a><a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter7/">回到上一章</a></h4><h3 id="事务的引入"><a href="#事务的引入" class="headerlink" title="事务的引入"></a>事务的引入</h3><ul>
<li>计算环境的脆弱性—故障恢复问题<ul>
<li>银行转帐(故障恢复)</li>
</ul>
</li>
<li>计算环境的分布性—并发控制问题<ul>
<li>订飞机票(并发执行)</li>
</ul>
</li>
</ul>
<h4 id="事务示例"><a href="#事务示例" class="headerlink" title="事务示例"></a>事务示例</h4><p>银行转帐:事务T从A帐户过户50¥到B帐户<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">T:<span class="built_in">read</span>(A);</span><br><span class="line"> A := A – 50;</span><br><span class="line"> write(A);</span><br><span class="line"> <span class="built_in">read</span>(B);</span><br><span class="line"> B := B + 50;</span><br><span class="line"> write(B);</span><br></pre></td></tr></table></figure></p>
<p>其中</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">read</span>(X):从数据库传送数据项X到事务的工作区中</span><br><span class="line">write(X):从事务的工作区中将数据项X写回数据库</span><br></pre></td></tr></table></figure>
<h4 id="事务中数据访问过程"><a href="#事务中数据访问过程" class="headerlink" title="事务中数据访问过程"></a>事务中数据访问过程</h4><p><img src="/2016/05/01/adb-note-chapter8/dataaccess.png" alt="数据访问过程"></p>
<h4 id="可恢复操作的问题与模型"><a href="#可恢复操作的问题与模型" class="headerlink" title="可恢复操作的问题与模型"></a>可恢复操作的问题与模型</h4><p>故障模式:</p>
<ul>
<li>错误数据输入:引入约束机制<ul>
<li>但有些错误是无法检测的,例如输错某一位。</li>
</ul>
</li>
<li>介质故障<ul>
<li>磁盘局部故障:可通过奇偶校验检测</li>
<li>磁盘重大故障:利用RAID</li>
</ul>
</li>
<li>灾难性故障<ul>
<li>RAID失效,因系统中所有磁盘均被破坏</li>
<li>可用备份或冗余分布式拷贝恢复</li>
</ul>
</li>
<li>系统故障:是导致事务状态丢失的问题<ul>
<li>掉电或软件错误</li>
<li>无法确定事务的哪些部分(包括对数据库的修改)已经进行</li>
</ul>
</li>
</ul>
<p>事务:</p>
<ul>
<li>事务是数据库操作的执行单位。每一个查询或数据库更新语句就是—个事务</li>
<li>在嵌入式SQL系统中,一旦对数据库进行的操作执行,事务就开始,而事务的结束使用显式的commit或rollback结束</li>
<li>SQL中事务的定义<ul>
<li>事务以Begin transaction开始,以Commit work或 Rollback work结束 </li>
<li>Commit work表示提交,事务正常结束</li>
<li>Rollback work表示事务非正常结束,撤消事务已做的操作,回滚到事务开始时的状态</li>
</ul>
</li>
</ul>
<h4 id="事务的ACID特性"><a href="#事务的ACID特性" class="headerlink" title="事务的ACID特性"></a>事务的ACID特性</h4><p>A:表示事务的原子性(Atomicity),即事务完全执行或完全不执行</p>
<ul>
<li>事务中包含的所有操作要么全做,要么全不做原子性由恢复机制实现</li>
</ul>
<p>C:表示一致性(Consistency),所有数据库都有一致性约束,或关于数据之间联系的预期状态</p>
<ul>
<li>事务的隔离执行必须保证数据库的一致性。事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。</li>
<li>数据库的一致性状态由用户来负责,由并发控制机制实现。如银行转帐,转帐前后两个帐户金额之和应保持不变</li>
</ul>
<p>I:表示隔离(Isolation),即表面看起来,每个事务都是在没有其它事务同时执行的情况下执行的</p>
<ul>
<li>系统必须保证事务不受其它并发执行事务的影响。对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行</li>
<li>隔离性通过并发控制机制实现</li>
</ul>
<p>D:表示持久性(Durability),即一旦事务完成了, 事务对数据库的影响就不会丢失</p>
<ul>
<li>一个事务一旦提交之后,它对数据库的影响必须是永久的</li>
<li>系统发生故障不能改变事务的持久性。持久性通过恢复机制实现</li>
</ul>
<h4 id="事务"><a href="#事务" class="headerlink" title="事务"></a>事务</h4><p>事务与数据库交互过程中使用的三种地址空间</p>
<ul>
<li>保存数据库元素的磁盘块空间</li>
<li>缓冲区管理器管理的地址空间</li>
<li>事务的局部地址空间</li>
</ul>
<p>三种空间的计划过程如下图所示<br><img src="/2016/05/01/adb-note-chapter8/transaction.png" alt="三种地址空间"><br>上图中<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">READ(X, t)和WRITE(t, X)由事务发出</span><br><span class="line">INPUT(X)和OUTPUT(X)由缓冲区管理器发出</span><br></pre></td></tr></table></figure></p>
<h4 id="事务的原语操作"><a href="#事务的原语操作" class="headerlink" title="事务的原语操作"></a>事务的原语操作</h4><p>用一种记法来描述使数据在地址空间之间移动的操作:</p>
<ul>
<li>1.INPUT(X):将包含数据库元素X的磁盘块拷贝到主存缓冲区</li>
<li>2.READ(X, t):将数据库元素X拷贝到事务的局部变量t</li>
<li>3.WRITE(X, t):将局部变量t的值拷贝到主存缓冲区中的数据库元素X</li>
<li><ol>
<li>OUTPUT(X):将包含X的缓冲区拷贝回磁盘</li>
</ol>
</li>
</ul>
<h4 id="事务状态"><a href="#事务状态" class="headerlink" title="事务状态"></a>事务状态</h4><p>下图说明了事务的几种状态以及这些状态间的转换<br><img src="/2016/05/01/adb-note-chapter8/事务状态转换.png" alt="几种状态的转换"></p>
<h3 id="undo-日志"><a href="#undo-日志" class="headerlink" title="undo 日志"></a>undo 日志</h3><ul>
<li>日志 <ul>
<li>日志是日志记录的一个序列,用于记载有关某个事务已做的事的某些情况</li>
</ul>
</li>
<li>日志块最初在主存中创建,一旦合适,日志块就被永久地写到磁盘上</li>
<li>日志记录的格式<ul>
<li><start t="">,表示事务T已经开始</start></li>
<li><commit t="">,表示事务T成功完成</commit></li>
<li><abort t="">,事务T未成功,被中止</abort></li>
<li><t, x,="" v="">,表示事务T改变了数据库元素X,X原来的值为v(X的旧值)</t,></li>
</ul>
</li>
<li>更新记录</li>
<li>undo日志规则</li>
<li><p>使用undo日志的恢复</p>
<ul>
<li>如果不能完全确定事务的影响已经完成并且已经存储到磁盘上,那么事务对数据库所做的所有更新都将被撤销,数据库被恢复,就好像这 - 些事务从来未曾执行过。</li>
</ul>
</li>
<li><p>更新记录</p>
<ul>
<li><t, x,="" v="">含义是,事务T改变了数据库元素X,X原来的值是v</t,></li>
<li>注意: undo日志不记录数据库元素的新值,而只记录旧值。如果在使用undo日志的系统中需要进行恢复时,恢复管理器要做的唯一事情是 通过恢复旧值消除事务可能在磁盘上造成的影响</li>
</ul>
</li>
<li>undo日志的规则<br>对于任一事务T,按照如下顺序向磁盘输出<br>T的日志信息: <ul>
<li>首先,写更新日志记录<t, x,="" v=""></t,></li>
<li>其次,改变数据库,执行OUTPUT(X)</li>
<li>最后,写<commit t="">日志<br>但是顺序是对各个数据库元素单独适用,而不是对事务的更新记录集合整个适用<br>→立即修改的技术<br>允许数据库修改在事务仍处于活跃状态时就输出到数据库中,此时称其为未提交修改</commit></li>
</ul>
</li>
</ul>
<p>例如对于下面的事务<br><img src="/2016/05/01/adb-note-chapter8/transactionexample.png" alt="事务举例"><br>其对应的日志顺序为<br><img src="/2016/05/01/adb-note-chapter8/transactionlog.png" alt="事务日志"></p>
<h4 id="使用undo日志进行恢复"><a href="#使用undo日志进行恢复" class="headerlink" title="使用undo日志进行恢复"></a>使用undo日志进行恢复</h4><ul>
<li>从尾部开始扫描日志</li>
<li>在扫描过程中,记住所有有<commit t="">和<abort t="">记录的事务T</abort></commit></li>
<li>在由尾部向后扫描的过程中,若看到<br> 有记录<t, x,="" v="">, 则<ul>
<li>若T的COMMIT记录已经被扫描到,则什么也不做;</li>
<li>否则,T是一个未完成的事务或被中止的事务。必须将数据库中X的值改为v。然后,将<abort t="">写入磁盘</abort></li>
</ul>
</t,></li>
</ul>
<p>例如对于下面的事务<br><img src="/2016/05/01/adb-note-chapter8/undolog.png" alt="undo日志"></p>
<ul>
<li>若执行到第2~11步中的任意一步发生故障,<ul>
<li>利用undo日志,恢复旧值</li>
</ul>
</li>
<li>若执行完第12步后发生故障,则表示T已经完全执行完,不必做任何处理动作</li>
</ul>
<h4 id="检查点:周期性地对日志作检查点"><a href="#检查点:周期性地对日志作检查点" class="headerlink" title="检查点:周期性地对日志作检查点"></a>检查点:周期性地对日志作检查点</h4><ul>
<li>静止检查点:<ul>
<li>停止接受新的事务</li>
<li>等到所有当前活跃事务提交或中止,并在日志中写入了COMMIT或ABORT记录</li>
<li>将日志刷新到磁盘</li>
<li>写入日志记录<ckpt>,并再次刷新日志</ckpt></li>
</ul>
</li>
<li>非静止检查点<ul>
<li>在进行检查点时不必关闭系统,允许新事务进入</li>
</ul>
</li>
</ul>
<h3 id="redo日志"><a href="#redo日志" class="headerlink" title="redo日志"></a>redo日志</h3><h4 id="Undo日志的一个问题"><a href="#Undo日志的一个问题" class="headerlink" title="Undo日志的一个问题"></a>Undo日志的一个问题</h4><p>将事务改变的所有数据写到磁盘前不能提交该事务</p>
<h4 id="redo日志-1"><a href="#redo日志-1" class="headerlink" title="redo日志"></a>redo日志</h4><p>更新记录的格式<t, x,="" v="">,其中,v为X的新值</t,></p>
<h4 id="redo日志的规则"><a href="#redo日志的规则" class="headerlink" title="redo日志的规则"></a>redo日志的规则</h4><ul>
<li>写磁盘的顺序为:<ul>
<li>更新记录<t, x,="" v=""></t,></li>
<li>COMMIT日志</li>
<li>OUTPUT(X)</li>
</ul>
</li>
<li>使用redo日志的恢复</li>
</ul>
<p>恢复管理器的工作:</p>
<ul>
<li>确定已提交的事务。</li>
<li>从首部开始扫描日志。对遇到的每一<t, x="" ,="" v="">记录:<ul>
<li>如果T是未提交的事务,则什么也不做。</li>
<li>如果T是提交的事务,则为数据库元素X写入值v。</li>
</ul>
</t,></li>
<li>对每个未完成的事务T,在日志中写入一个<abort t="">记录并刷新日志。</abort></li>
</ul>
<p>下面是一个redo日志的例子<br><img src="/2016/05/01/adb-note-chapter8/redoexample.png" alt="redo日志例子"></p>
<h4 id="redo日志的检查点"><a href="#redo日志的检查点" class="headerlink" title="redo日志的检查点"></a>redo日志的检查点</h4><ul>
<li>不管检查点是静止的还是非静止的,在检查点的开始和结束之间我们必须采取的一个关键动作是将已被提交事务修改但还未写到磁盘的所有数据库元素写到磁盘</li>
<li>另一方面,我们不需要等待活跃事务提交或中止就能完成检查点,因为它们无论如何都不允许在那个时候将它们的页写到磁盘</li>
</ul>
<p><img src="/2016/05/01/adb-note-chapter8/redoexample1.png" alt="redo日志举例"></p>
<h4 id="检查点恢复规则"><a href="#检查点恢复规则" class="headerlink" title="检查点恢复规则"></a>检查点恢复规则</h4><ul>
<li>找到最后一个<end ckpt="">日志</end></li>
<li>对于在相应检查点插入时活跃的事务和插入检查点之后开始的事务,记录所有需要Redo的已提交事务</li>
<li>从需redo事务中最早开始的事务向后扫描,并Redo所有需要提交的事务</li>
<li>对未提交的事务插入 <abort t=""></abort></li>
</ul>
<p><img src="/2016/05/01/adb-note-chapter8/含有checkpoint的redo示例.png" alt="含有checkpoint的redo示例"></p>
<h3 id="undo日志vs-redo日志"><a href="#undo日志vs-redo日志" class="headerlink" title="undo日志vs.redo日志"></a>undo日志vs.redo日志</h3><p>Undo日志与Redo日志的主要区别<br><strong>当数据库元素被修改时日志中保存旧值还是新值</strong></p>
<ul>
<li>Undo日志要求数据在事务结束后立即写到磁盘,可能增加需要进行的磁盘I/O数</li>
<li>Redo日志要求我们在事务提交和日志记录刷新以前将所有修改过的块保留在缓冲区中,可能增加事务需要的平均缓冲区数</li>
</ul>
<h3 id="undo-redo日志"><a href="#undo-redo日志" class="headerlink" title="undo/redo日志"></a>undo/redo日志</h3><h4 id="undo-redo日志结合了两种日志的优点"><a href="#undo-redo日志结合了两种日志的优点" class="headerlink" title="undo/redo日志结合了两种日志的优点"></a>undo/redo日志结合了两种日志的优点</h4><p>代价:在日志中维护更多信息 <t,x, v,="" w="">,事务T更新了数据库元素X的值;其更新前的值为v,更新后的值为w</t,x,></p>
<h4 id="undo-redo日志规则"><a href="#undo-redo日志规则" class="headerlink" title="undo/redo日志规则"></a>undo/redo日志规则</h4><ul>
<li>在事务T所更新磁盘上的数据库元素X之前,相应日志记录<t, x,="" v,="" w="">必须写入磁盘</t,></li>
<li>注意:此处没有任何对commit日志记录的要求,Undo/Redo日志仅需要满足Undo 和Redo日志共同的限制</li>
</ul>
<h4 id="undo-redo日志恢复过程"><a href="#undo-redo日志恢复过程" class="headerlink" title="undo/redo日志恢复过程"></a>undo/redo日志恢复过程</h4><ul>
<li>从后往前扫描日志,构造undo-list和redo-list<ul>
<li>对每个形如<ti commit="">的记录,将Ti 加入redo-list</ti></li>
<li>对每个形如<ti start="">的记录,如果Ti不属于redo-list,则将Ti加入undo-list</ti></li>
</ul>
</li>
<li>由后至前扫描日志,对undo-list中的每个事务 Ti的每一个日志记录执行undo操作<ul>
<li>在具体实现中本步骤可以和第一步一起进行</li>
</ul>
</li>
<li>由前至后重新扫描日志,并且对redo-list中每个事务Ti的每一个日志记录执行redo操作<ul>
<li>对每个未完成的事务在日志Ti末尾加入<abort ti="">, Flush log 并将数据库置为正常状态</abort></li>
</ul>
</li>
</ul>
<h4 id="undo-redo日志的检查点"><a href="#undo-redo日志的检查点" class="headerlink" title="undo/redo日志的检查点"></a>undo/redo日志的检查点</h4><ul>
<li>写入日志记录<start ckpt(t1,="" …,="" tk)="">,其中,T1, …, Tk是所有的活跃事务, 并刷新日志</start></li>
<li>将所有脏缓冲区写到磁盘,脏缓冲区即包含一个或多个修改过的数据库元素的缓冲区<ul>
<li>注意:该过程并不将检查点开始和结束之间修改的数据写入磁盘</li>
</ul>
</li>
<li>写入日志记录<end ckpt="">并刷新日志</end></li>
</ul>
<h3 id="防备介质故障"><a href="#防备介质故障" class="headerlink" title="防备介质故障"></a>防备介质故障</h3><ul>
<li>当主存数据丢失时,日志可以保证磁盘上的数据不会丢失。</li>
<li>然而,当一个或多个磁盘丢失时,如果下列条件成立,可以通过日志重建数据库:<ul>
<li>日志所在的磁盘不同于存放数据的磁盘</li>
<li>日志在检查点以后不会被丢弃,并且</li>
<li>日志是redo或undo/redo类型,因而新值被存储在日志当中</li>
</ul>
</li>
<li>然而,实际中,日志的增长远比数据库快,所以,永远保存日志是不现实的</li>
</ul>
<h4 id="防备介质故障的措施"><a href="#防备介质故障的措施" class="headerlink" title="防备介质故障的措施"></a>防备介质故障的措施</h4><p>备份:当介质故障发生时,数据库可以恢复到备份那一时刻的状态</p>
<ul>
<li>要前进到一个更近的状态,可以使用日志</li>
<li>具体方式<ul>
<li>完全转储</li>
<li>增量转储</li>
</ul>
</li>
</ul>
<p>日志恢复</p>
<h3 id="下一章-并发控制"><a href="#下一章-并发控制" class="headerlink" title="下一章 并发控制"></a>下一章 <a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter9/">并发控制</a></h3>
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回
《高级数据库系统》笔记—— 第七章 查询编译器
http://wenqiang-china.github.io/2016/05/01/adb-note-chapter7/
2016-05-01T04:10:38.782Z
2016-05-01T04:25:01.978Z
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回到上一章"></a><a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter6/">回到上一章</a></h4><h3 id="内容概览"><a href="#内容概览" class="headerlink" title="内容概览"></a>内容概览</h3><p>本章主要内容如下:</p>
<ul>
<li>查询分析组件<ul>
<li>tokenizer, parser, access planner, optimizer, buffer manager</li>
<li>logical and physical query plans</li>
</ul>
</li>
<li>查询优化<ul>
<li>relational algebra laws for query plans</li>
<li>cost based optimization versus heuristic optimization</li>
</ul>
</li>
</ul>
<p>下面具体介绍</p>
<h3 id="下一章-日志与故障恢复"><a href="#下一章-日志与故障恢复" class="headerlink" title="下一章 日志与故障恢复"></a>下一章 <a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter8/">日志与故障恢复</a></h3>
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回
《高级数据库系统》笔记—— 第六章 查询执行
http://wenqiang-china.github.io/2016/05/01/adb-note-chapter6/
2016-05-01T04:09:28.974Z
2016-05-01T04:24:53.241Z
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回到上一章"></a><a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter5/">回到上一章</a></h4><h3 id="查询编译过程"><a href="#查询编译过程" class="headerlink" title="查询编译过程"></a>查询编译过程</h3><ul>
<li>A 查询分析:构造分析树表达查询及其结构</li>
<li>B 查询重写:将分析树转化为逻辑查询计划<ul>
<li>逻辑查询计划通常是查询的代数表达式</li>
<li>逻辑查询计划将会被转化为一个预期所需时间较小的等价的计划</li>
</ul>
</li>
<li>C 生成物理查询计划:根据B 步骤生成的逻辑查询计划的每一个操作符选择实现算法,并选择操作符的执行顺序物理计划还包括许多细节 ,如被查询的关系是如何访问的,及关系是否需要排序等</li>
</ul>
<p>B,C部分被称为查询优化器</p>
<h3 id="下一章-查询编译器"><a href="#下一章-查询编译器" class="headerlink" title="下一章 查询编译器"></a>下一章 <a href="http://wenqiang-china.github.io/2016/05/01/adb-note-chapter7/">查询编译器</a></h3>
<h4 id="回到上一章"><a href="#回到上一章" class="headerlink" title="回