<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[[python] 常用正则表达式爬取网页信息及分析HTML标签总结]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Thu, 19 May 2016 14:41:34 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	这篇文章主要是介绍Python爬取网页信息时，经常使用的正则表达式及方法。它是一篇总结性文章，实用性比较大，主要解决自己遇到的爬虫问题，也希望对你有所帮助~<br/>当然如果会Selenium基于自动化测试爬虫、BeautifulSoup分析网页DOM节点，这就更方便了，但本文更多的是介绍基于正则的底层爬取分析。<br/><br/>涉及内容如下：<br/>常用正则表达式爬取网页信息及HTML分析总结<br/>1.获取&lt;tr&gt;&lt;/tr&gt;标签之间内容<br/>2.获取&lt;a href..&gt;&lt;/a&gt;超链接之间内容<br/>3.获取URL最后一个参数命名图片或传递参数<br/>4.爬取网页中所有URL链接<br/>5.爬取网页标题title两种方法<br/>6.定位table位置并爬取属性-属性值<br/>7.过滤&lt;span&gt;&lt;/span&gt;等标签<br/>8.获取&lt;script&gt;&lt;/script&gt;等标签内容<br/>推荐基础文章：Python正则表达式指南 - AstralWind<br/><br/><br/>------------------------------------------------------------------------------------------------------------------------------<br/>1.获取&lt;tr&gt;&lt;/tr&gt;标签之间内容<br/>该部分主要是通过正则表达式获取两个标签之间的内容，通常这种标签都是成对出现的。<br/>开始标签如：&lt;tr&gt;、&lt;th&gt;、&lt;td&gt;、&lt;a&gt;、&lt;table&gt;、&lt;div&gt;...<br/>后缀标签如：&lt;/tr&gt;、&lt;/th&gt;、&lt;/td&gt;、&lt;/a&gt;、&lt;/table&gt;、&lt;/div&gt;...<br/><br/>核心代码：<br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res_tr = r&#039;&lt;tr&gt;(.*?)&lt;/tr&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_tr =&nbsp;&nbsp;re.findall(res_tr,language,re.S&#124;re.M)<br/></div><br/>例子：<br/><div class="code"><br/># coding=utf-8<br/>import re<br/><br/>language = &#039;&#039;&#039;&lt;tr&gt;&lt;th&gt;性別：&lt;/th&gt;&lt;td&gt;男&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&#039;&#039;&#039;<br/><br/>#正则表达式获取&lt;tr&gt;&lt;/tr&gt;之间内容<br/>res_tr = r&#039;&lt;tr&gt;(.*?)&lt;/tr&gt;&#039;<br/>m_tr =&nbsp;&nbsp;re.findall(res_tr,language,re.S&#124;re.M)<br/>for line in m_tr:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print line<br/>&nbsp;&nbsp;&nbsp;&nbsp;#获取表格第一列th 属性<br/>&nbsp;&nbsp;&nbsp;&nbsp;res_th = r&#039;&lt;th&gt;(.*?)&lt;/th&gt;&#039;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;m_th = re.findall(res_th,line,re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for mm in m_th:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(mm,&#039;utf-8&#039;),&nbsp;&nbsp;#unicode防止乱<br/>&nbsp;&nbsp;&nbsp;&nbsp;#获取表格第二列td 属性值<br/>&nbsp;&nbsp;&nbsp;&nbsp;res_td = r&#039;&lt;td&gt;(.*?)&lt;/td&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;m_td = re.findall(res_td,line,re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for nn in m_td:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(nn,&#039;utf-8&#039;)<br/></div><br/>输出如下所示：<br/><div class="code"><br/>&gt;&gt;&gt; <br/>&lt;th&gt;性別：&lt;/th&gt;&lt;td&gt;男&lt;/td&gt;<br/>性別： 男<br/>&gt;&gt;&gt; <br/></div><br/>python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例，然后使用Pattern实例处理文本并获得匹配结果（一个Match实例），最后使用Match实例获得信息，进行其他的操作。<br/><br/>findall(string[, pos[, endpos]]) &amp;#124; re.findall(pattern, string[, flags]): 搜索string，以列表形式返回全部能匹配的子串。其中RE的常见参数包括：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re.I(re.IGNORECASE): 忽略大小写（括号内是完整写法）<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re.M(re.MULTILINE): 多行模式，改变&#039;^&#039;和&#039;$&#039;的行为<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re.S(re.DOTALL): 点任意匹配模式，改变&#039;.&#039;的行为<br/><br/>------------------------------------------------------------------------------------------------------------------------------<br/>2.获取超链接&lt;a href=..&gt;&lt;/a&gt;之间内容<br/>通常在使用正则表达式时，需要分析网页链接，获取URL或网页内容。核心代码如下：<br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res = r&#039;&lt;a .*?&gt;(.*?)&lt;/a&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mm =&nbsp;&nbsp;re.findall(res, content, re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urls=re.findall(r&quot;&lt;a.*?href=.*?&lt;&#92;/a&gt;&quot;, content, re.I&#124;re.S&#124;re.M)<br/></div><br/>例子：<br/><div class="code"><br/># coding=utf-8<br/>import re<br/><br/>content = &#039;&#039;&#039;<br/>&lt;td&gt;<br/>&lt;a href=&quot;https://www.baidu.com/articles/zj.html&quot; title=&quot;浙江省&quot;&gt;浙江省主题介绍&lt;/a&gt;<br/>&lt;a href=&quot;https://www.baidu.com//articles/gz.html&quot; title=&quot;贵州省&quot;&gt;贵州省主题介绍&lt;/a&gt;<br/>&lt;/td&gt;<br/>&#039;&#039;&#039;<br/></div><br/>#获取&lt;a href&gt;&lt;/a&gt;之间的内容<br/>print u&#039;获取链接文本内容:&#039;<br/><div class="code"><br/>res = r&#039;&lt;a .*?&gt;(.*?)&lt;/a&gt;&#039;<br/>mm =&nbsp;&nbsp;re.findall(<br/>res, content, re.S&#124;re.M)<br/>for value in mm:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print value<br/><br/>#获取所有&lt;a href&gt;&lt;/a&gt;链接所有内容<br/>print u&#039;&#92;n获取完整链接内容:&#039;<br/>urls=re.findall(r&quot;&lt;a.*?href=.*?&lt;&#92;/a&gt;&quot;, content, re.I&#124;re.S&#124;re.M)<br/>for i in urls:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print i<br/><br/>#获取&lt;a href&gt;&lt;/a&gt;中的URL<br/>print u&#039;&#92;n获取链接中URL:&#039;<br/>res_url = r&quot;(?&lt;=href=&#92;&quot;).+?(?=&#92;&quot;)&#124;(?&lt;=href=&#92;&#039;).+?(?=&#92;&#039;)&quot;<br/>link = re.findall(res_url ,&nbsp;&nbsp;content, re.I&#124;re.S&#124;re.M)<br/>for url in link:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print url<br/>输出如下图所示：<br/>&gt;&gt;&gt; <br/>获取链接文本内容:<br/>浙江省主题介绍<br/>贵州省主题介绍<br/><br/>获取完整链接内容:<br/>&lt;a href=&quot;https://www.baidu.com/articles/zj.html&quot; title=&quot;浙江省&quot;&gt;浙江省主题介绍&lt;/a&gt;<br/>&lt;a href=&quot;https://www.baidu.com//articles/gz.html&quot; title=&quot;贵州省&quot;&gt;贵州省主题介绍&lt;/a&gt;<br/><br/>获取链接中URL:<br/>https://www.baidu.com/articles/zj.html<br/>https://www.baidu.com//articles/gz.html<br/>&gt;&gt;&gt; <br/></div><br/>当然如果是通过Selenium分析DOM树结构获取href对应的url或title中的值，其核心代码如下所示，这里主要是给大家做个对比，理解不同方法的优势：<br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driver.get(link) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elem = driver.find_elements_by_xpath(&quot;//div&#91;@class=&#039;piclist&#039;&#93;/tr/dd&#91;1&#93;&quot;)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for url in elem:&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pic_url = url.get_attribute(&quot;href&quot;)&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print pic_url<br/></div><br/>参考文章：[python爬虫] Selenium定向爬取虎扑篮球海量精美图片<br/><br/>------------------------------------------------------------------------------------------------------------------------------<br/>3.获取URL最后一个参数命名图片或传递参数<br/>通常在使用Python爬取图片过程中，会遇到图片对应的URL最后一个字段通常用于命名图片，如虎扑孙悦妻子图片：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://i1.hoopchina.com.cn/blogfile/201411/11/BbsImg141568417848931_640" target="_blank">http://i1.hoopchina.com.cn/blogfile/201411/11/BbsImg141568417848931_640</a>*640.jpg<br/>此时需要通过该URL的&quot;/&quot;后面的参数命名图片，则方法如下：<br/><div class="code"><br/>urls = &quot;http://i1.hoopchina.com.cn/blogfile/201411/11/BbsImg141568417848931_640*640.jpg&quot;<br/>values = urls.split(&#039;/&#039;)&#91;-1&#93;<br/>print values<br/>输出如下所示：<br/>&gt;&gt;&gt; <br/>BbsImg141568417848931_640*640.jpg<br/>&gt;&gt;&gt; <br/>在使用Python获取GET方法的URL链接中，还可能存在传递参数的值。<br/>此时获取参数方法如下：<br/>url = &#039;http://localhost/test.py?a=hello&amp;b=world&#039;&nbsp;&nbsp;<br/>values = url.split(&#039;?&#039;)&#91;-1&#93;&nbsp;&nbsp;<br/>print values&nbsp;&nbsp;<br/>for key_value in values.split(&#039;&amp;&#039;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;print key_value.split(&#039;=&#039;) <br/>输出如下所示：<br/>&gt;&gt;&gt; <br/>a=hello&amp;b=world<br/>&#91;&#039;a&#039;, &#039;hello&#039;&#93;<br/>&#91;&#039;b&#039;, &#039;world&#039;&#93;<br/>&gt;&gt;&gt; <br/></div><br/>------------------------------------------------------------------------------------------------------------------------------<br/><br/>4.爬取网页中所有URL链接<br/><br/>在学习爬虫过程中，你肯定需要从固有网页中爬取URL链接，再进行下一步的循环爬取或URL抓取。如下，爬取CSDN首页的所有URL链接。<br/><div class="code"><br/># coding=utf-8<br/>import re<br/>import urllib<br/><br/>url = &quot;http://www.csdn.net/&quot;<br/>content = urllib.urlopen(url).read()<br/>urls = re.findall(r&quot;&lt;a.*?href=.*?&lt;&#92;/a&gt;&quot;, content, re.I)<br/>for url in urls:<br/>&nbsp;&nbsp;&nbsp;&nbsp;print unicode(url,&#039;utf-8&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>link_list = re.findall(r&quot;(?&lt;=href=&#92;&quot;).+?(?=&#92;&quot;)&#124;(?&lt;=href=&#92;&#039;).+?(?=&#92;&#039;)&quot;, content)<br/>for url in link_list:&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;print url <br/>输出如下所示：<br/>&gt;&gt;&gt; <br/>&lt;a href=&quot;https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn&quot;&gt;登录&lt;/a&gt;<br/>&lt;a href=&quot;http://passport.csdn.net/account/mobileregister?action=mobileRegister&quot;&gt;注册&lt;/a&gt;<br/>&lt;a href=&quot;https://passport.csdn.net/help/faq&quot;&gt;帮助&lt;/a&gt;<br/>...<br/>https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn<br/>http://passport.csdn.net/account/mobileregister?action=mobileRegister<br/>https://passport.csdn.net/help/faq<br/>...<br/>&gt;&gt;&gt;<br/></div><br/>------------------------------------------------------------------------------------------------------------------------------<br/><br/>5.爬取网页标题title两种方法<br/><br/>获取网页标题也是一种常见的爬虫，如我在爬取维基百科国家信息时，就需要爬取网页title。通常位于&lt;html&gt;&lt;head&gt;&lt;title&gt;标题&lt;/title&gt;&lt;/head&gt;&lt;/html&gt;中。<br/>下面是爬取CSDN标题的两种方法介绍：<br/><div class="code"><br/># coding=utf-8<br/>import re<br/>import urllib<br/><br/>url = &quot;http://www.csdn.net/&quot;<br/>content = urllib.urlopen(url).read()<br/><br/>print u&#039;方法一:&#039;<br/>title_pat = r&#039;(?&lt;=&lt;title&gt;).*?(?=&lt;/title&gt;)&#039;&nbsp;&nbsp;<br/>title_ex = re.compile(title_pat,re.M&#124;re.S)&nbsp;&nbsp;<br/>title_obj = re.search(title_ex, content)<br/>title = title_obj.group()<br/>print title<br/><br/>print u&#039;方法二:&#039;<br/>title = re.findall(r&#039;&lt;title&gt;(.*?)&lt;/title&gt;&#039;, content)<br/>print title&#91;0&#93;<br/>输出如下所示：<br/>&gt;&gt;&gt; <br/>方法一:<br/>CSDN.NET - 全球最大中文IT社区，为IT专业技术人员提供最全面的信息传播和服务平台<br/>方法二:<br/>CSDN.NET - 全球最大中文IT社区，为IT专业技术人员提供最全面的信息传播和服务平台<br/>&gt;&gt;&gt; <br/><br/></div><br/>------------------------------------------------------------------------------------------------------------------------------<br/><br/>6.定位table位置并爬取属性-属性值<br/><br/>如果使用Python库的一些爬取，通常可以通过DOM树结构进行定位，如代码：<br/><div class="code">&nbsp;&nbsp;&nbsp;&nbsp;login = driver.find_element_by_xpath(&quot;//form&#91;@id=&#039;loginForm&#039;&#93;&quot;) </div><br/>参考文章：[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍<br/><br/>但如果是正则表达式这种相对传统傻瓜式的方法，通过通过find函数寻找指定table方法进行定位。如：获取Infobox的table信息。<br/>通过分析源代码发现“程序设计语言列表”的消息盒如下：<br/><div class="code"><br/>&lt;table class=&quot;infobox vevent&quot; ..&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br/>start = content.find(r&#039;&lt;table class=&quot;infobox vevent&quot;&#039;) #起点记录查询位置&nbsp;&nbsp;<br/>end = content.find(r&#039;&lt;/table&gt;&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>infobox = language&#91;start:end&#93;&nbsp;&nbsp;<br/>print infobox <br/>print infobox 输出其中一门语言ActionScript的InfoBox消息盒部分源代码如下：<br/>&lt;table class=&quot;infobox vevent&quot; cellspacing=&quot;3&quot; style=&quot;border-spacing:3px;width:22em;text-align:left;font-size:small;line-height:1.5em;&quot;&gt;&nbsp;&nbsp; <br/>&lt;caption class=&quot;summary&quot;&gt;&lt;b&gt;ActionScript&lt;/b&gt;&lt;/caption&gt;&nbsp;&nbsp; <br/>&lt;tr&gt;&nbsp;&nbsp; <br/>&lt;th scope=&quot;row&quot; style=&quot;text-align:left;white-space:nowrap;;;&quot;&gt;发行时间&lt;/th&gt;&nbsp;&nbsp; <br/>&lt;td style=&quot;;;&quot;&gt;1998年&lt;/td&gt;&nbsp;&nbsp; <br/>&lt;/tr&gt;&nbsp;&nbsp; <br/>&lt;tr&gt;&nbsp;&nbsp; <br/>&lt;th scope=&quot;row&quot; style=&quot;text-align:left;white-space:nowrap;;;&quot;&gt;实现者&lt;/th&gt;&nbsp;&nbsp; <br/>&lt;td class=&quot;organiser&quot; style=&quot;;;&quot;&gt;&lt;a href=&quot;/wiki/Adobe_Systems&quot; title=&quot;Adobe Systems&quot;&gt;Adobe Systems&lt;/a&gt;&lt;/td&gt;&nbsp;&nbsp; <br/>&lt;/tr&gt;&nbsp;&nbsp; <br/>&lt;tr&gt;&nbsp;&nbsp; <br/>&lt;tr&gt;&nbsp;&nbsp; <br/>&lt;th scope=&quot;row&quot; style=&quot;text-align:left;white-space:nowrap;;;&quot;&gt;启发语言&lt;/th&gt;&nbsp;&nbsp; <br/>&lt;td style=&quot;;;&quot;&gt;&lt;a href=&quot;/wiki/JavaScript&quot; title=&quot;JavaScript&quot;&gt;JavaScript&lt;/a&gt;、&lt;a href=&quot;/wiki/Java&quot; title=&quot;Java&quot;&gt;Java&lt;/a&gt;&lt;/td&gt;&nbsp;&nbsp; <br/>&lt;/tr&gt;&nbsp;&nbsp; <br/>&lt;/table&gt;&nbsp;&nbsp;<br/>参考文章：&#91;python学习&#93; 简单爬取维基百科程序语言消息盒<br/>然后再在这个infobox内容中通过正则表达式进行分析爬取。下面讲述爬取属性-属性值：<br/>爬取格式如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;属性&lt;/th&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;属性值&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br/>其中th表示加粗处理，td和th中可能存在属性如title、id、type等值；同时&lt;td&gt;&lt;/td&gt;之间的内容可能存在&lt;a href=..&gt;&lt;/a&gt;或&lt;span&gt;&lt;/span&gt;或&lt;br /&gt;等值，都需要处理。下面先讲解正则表达式获取td值的例子：<br/>参考：http://bbs.csdn.net/topics/390353859?page=1<br/>&lt;table&gt;&nbsp;&nbsp;<br/>&lt;tr&gt;&nbsp;&nbsp;<br/>&lt;td&gt;序列号&lt;/td&gt;&lt;td&gt;DEIN3-39CD3-2093J3&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;td&gt;日期&lt;/td&gt;&lt;td&gt;2013年1月22日&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;td&gt;售价&lt;/td&gt;&lt;td&gt;392.70 元&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;td&gt;说明&lt;/td&gt;&lt;td&gt;仅限5用户使用&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;/tr&gt;&nbsp;&nbsp;<br/>&lt;/table&gt;&nbsp;&nbsp;<br/>Python代码如下：<br/># coding=utf-8<br/>import re<br/><br/>s = &#039;&#039;&#039;&lt;table&gt;&nbsp;&nbsp;<br/>&lt;tr&gt;&nbsp;&nbsp;<br/>&lt;td&gt;序列号&lt;/td&gt;&lt;td&gt;DEIN3-39CD3-2093J3&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;td&gt;日期&lt;/td&gt;&lt;td&gt;2013年1月22日&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;td&gt;售价&lt;/td&gt;&lt;td&gt;392.70 元&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;td&gt;说明&lt;/td&gt;&lt;td&gt;仅限5用户使用&lt;/td&gt;&nbsp;&nbsp;<br/>&lt;/tr&gt;&nbsp;&nbsp;<br/>&lt;/table&gt;<br/>&#039;&#039;&#039; <br/><br/>res = r&#039;&lt;td&gt;(.*?)&lt;/td&gt;&lt;td&gt;(.*?)&lt;/td&gt;&#039;&nbsp;&nbsp;<br/>m = re.findall(res,s,re.S&#124;re.M)&nbsp;&nbsp;<br/>for line in m:&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;print unicode(line&#91;0&#93;,&#039;utf-8&#039;),unicode(line&#91;1&#93;,&#039;utf-8&#039;) #unicode防止乱码&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>#输出结果如下：&nbsp;&nbsp;<br/>#序列号 DEIN3-39CD3-2093J3&nbsp;&nbsp;<br/>#日期 2013年1月22日&nbsp;&nbsp;<br/>#售价 392.70 元&nbsp;&nbsp;<br/>#说明 仅限5用户使用 <br/>如果&lt;td id=&quot;&quot;&gt;包含该属性则正则表达式为r&#039;&lt;td id=.*?&gt;(.*?)&lt;/td&gt;&#039;；同样如果不一定是id属性开头，则可以使用正则表达式r&#039;&lt;td .*?&gt;(.*?)&lt;/td&gt;&#039;。<br/><br/></div><br/>------------------------------------------------------------------------------------------------------------------------------<br/><br/>7.过滤&lt;span&gt;&lt;/span&gt;等标签<br/><br/>在获取值过程中，通常会存在&lt;span&gt;、&lt;br&gt;、&lt;a href&gt;等标签，下面举个例子过滤。<br/>&lt;td&gt;&lt;span class=&quot;nickname&quot;&gt;(字) 翔宇&lt;/span&gt;&lt;/td&gt;过滤标签&lt;span&gt;核心代码：<br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;elif &quot;span&quot; in nn: #处理标签&lt;span&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res_value = r&#039;&lt;span .*?&gt;(.*?)&lt;/span&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_value = re.findall(res_value,nn,re.S&#124;re.M) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for value in m_value:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(value,&#039;utf-8&#039;),<br/>代码如下，注意print中逗号连接字符串：<br/># coding=utf-8<br/>import re<br/><br/>language = &#039;&#039;&#039;<br/>&lt;table class=&quot;infobox bordered vcard&quot; style=&quot;width: 21em; font-size: 89%; text-align: left;&quot; cellpadding=&quot;3&quot;&gt;<br/>&lt;caption style=&quot;text-align: center; font-size: larger;&quot; class=&quot;fn&quot;&gt;&lt;b&gt;周恩来&lt;/b&gt;&lt;/caption&gt;<br/>&lt;tr&gt;<br/>&lt;th&gt;性別：&lt;/th&gt;<br/>&lt;td&gt;男&lt;/td&gt;d<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;th&gt;異名：&lt;/th&gt;<br/>&lt;td&gt;&lt;span class=&quot;nickname&quot;&gt;(字) 翔宇&lt;/span&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;th&gt;政黨：&lt;/th&gt;<br/>&lt;td&gt;&lt;span class=&quot;org&quot;&gt;&lt;a href=&quot;../articles/%E4%B8%AD9A.html&quot; title=&quot;中国共产党&quot;&gt;中国共产党&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;tr&gt;<br/>&lt;th&gt;籍貫：&lt;/th&gt;<br/>&lt;td&gt;&lt;a href=&quot;../articles/%E6%B5%9981.html&quot; title=&quot;浙江省&quot;&gt;浙江省&lt;/a&gt;&lt;a href=&quot;../articles/%E7%BB%8D82.html&quot; title=&quot;绍兴市&quot;&gt;绍兴市&lt;/a&gt;&lt;/td&gt;<br/>&lt;/tr&gt;<br/>&lt;/table&gt;<br/>&#039;&#039;&#039; <br/><br/>#获取table中tr值<br/>res_tr = r&#039;&lt;tr&gt;(.*?)&lt;/tr&gt;&#039;<br/>m_tr =&nbsp;&nbsp;re.findall(res_tr,language,re.S&#124;re.M)<br/>for line in m_tr:<br/>&nbsp;&nbsp;&nbsp;&nbsp;#获取表格第一列th 属性<br/>&nbsp;&nbsp;&nbsp;&nbsp;res_th = r&#039;&lt;th&gt;(.*?)&lt;/th&gt;&#039;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;m_th = re.findall(res_th,line,re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for mm in m_th:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &quot;href&quot; in mm: #如果获取加粗的th中含超链接则处理<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;restr = r&#039;&lt;a href=.*?&gt;(.*?)&lt;/a&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h = re.findall(restr,mm,re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(h&#91;0&#93;,&#039;utf-8&#039;), #逗号连接属性值 防止换行<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(mm,&#039;utf-8&#039;),&nbsp;&nbsp; #unicode防止乱<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;#获取表格第二列td 属性值<br/>&nbsp;&nbsp;&nbsp;&nbsp;res_td = r&#039;&lt;td&gt;(.*?)&lt;/td&gt;&#039;&nbsp;&nbsp;#r&#039;&lt;td .*?&gt;(.*?)&lt;/td&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;m_td = re.findall(res_td,line,re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for nn in m_td:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &quot;href&quot; in nn: #处理超链接&lt;a href=../rel=..&gt;&lt;/a&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res_value = r&#039;&lt;a .*?&gt;(.*?)&lt;/a&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_value = re.findall(res_value,nn,re.S&#124;re.M)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for value in m_value:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(value,&#039;utf-8&#039;),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif &quot;span&quot; in nn: #处理标签&lt;span&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res_value = r&#039;&lt;span .*?&gt;(.*?)&lt;/span&gt;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_value = re.findall(res_value,nn,re.S&#124;re.M) #&lt;td&gt;&lt;span class=&quot;nickname&quot;&gt;(字) 翔宇&lt;/span&gt;&lt;/td&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for value in m_value:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(value,&#039;utf-8&#039;),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print unicode(nn,&#039;utf-8&#039;),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &#039; &#039; #换行<br/>输出如下所示：<br/>&gt;&gt;&gt; <br/>性別： 男&nbsp;&nbsp;<br/>異名： (字) 翔宇&nbsp;&nbsp;<br/>政黨： 中国共产党&nbsp;&nbsp;<br/>籍貫： 浙江省 绍兴市&nbsp;&nbsp;<br/>&gt;&gt;&gt; <br/><br/><br/></div><br/>------------------------------------------------------------------------------------------------------------------------------<br/><br/>8.获取&lt;script&gt;&lt;/script&gt;等标签内容<br/><br/>比如在获取游讯网图库中，图集对应的原图它是存储在script中，其中获取原图-original即可，缩略图-thumb，大图-big，通过正则表达式下载URL：<br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res_original = r&#039;&quot;original&quot;:&quot;(.*?)&quot;&#039; #原图<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_original = re.findall(res_original,script)<br/></div><br/>代码如下：<br/><div class="code"><br/># coding=utf-8<br/>import re<br/>import os <br/><br/>content = &#039;&#039;&#039;<br/>&lt;script&gt;var images = &#91;&nbsp;&nbsp;<br/>&#123; &quot;big&quot;:&quot;http://i-2.yxdown.com/2015/3/18/KDkwMHgp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg&quot;,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&quot;thumb&quot;:&quot;http://i-2.yxdown.com/2015/3/18/KHgxMjAp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg&quot;,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&quot;original&quot;:&quot;http://i-2.yxdown.com/2015/3/18/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg&quot;,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&quot;title&quot;:&quot;&quot;,&quot;descript&quot;:&quot;&quot;,&quot;id&quot;:75109&#125;,&nbsp;&nbsp;<br/>&#123; &quot;big&quot;:&quot;http://i-2.yxdown.com/2015/3/18/KDkwMHgp/fec26de9-8727-424a-b272-f2827669a320.jpg&quot;,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&quot;thumb&quot;:&quot;http://i-2.yxdown.com/2015/3/18/KHgxMjAp/fec26de9-8727-424a-b272-f2827669a320.jpg&quot;,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&quot;original&quot;:&quot;http://i-2.yxdown.com/2015/3/18/fec26de9-8727-424a-b272-f2827669a320.jpg&quot;,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&quot;title&quot;:&quot;&quot;,&quot;descript&quot;:&quot;&quot;,&quot;id&quot;:75110&#125;,&nbsp;&nbsp; <br/>&lt;/script&gt;&nbsp;&nbsp;<br/>&#039;&#039;&#039; <br/><br/>html_script = r&#039;&lt;script&gt;(.*?)&lt;/script&gt;&#039;&nbsp;&nbsp;<br/>m_script = re.findall(html_script,content,re.S&#124;re.M)&nbsp;&nbsp;<br/>for script in m_script:<br/>&nbsp;&nbsp;&nbsp;&nbsp;res_original = r&#039;&quot;original&quot;:&quot;(.*?)&quot;&#039; #原图<br/>&nbsp;&nbsp;&nbsp;&nbsp;m_original = re.findall(res_original,script)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for pic_url in m_original:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print pic_url<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filename = os.path.basename(pic_url) #去掉目录路径,返回文件名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urllib.urlretrieve(pic_url, &#039;E:&#92;&#92;&#039;+filename) #下载图片<br/></div><br/>运行结果如下图所示，同时下载图片至E盘。<br/>Tags - <a href="http://www.dzhope.com/tags/%25E6%25AD%25A3%25E5%2588%2599%25E8%25A1%25A8%25E8%25BE%25BE%25E5%25BC%258F/" rel="tag">正则表达式</a> , <a href="http://www.dzhope.com/tags/python/" rel="tag">python</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] [python] 常用正则表达式爬取网页信息及分析HTML标签总结]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>