【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则

【问题】

python正则表达式的问题

的:

<divclass="lib-cat"><h3>分类索引</h3><divclass="list"><ul><li><ahref="/search/movie">电影</a></li><li><ahref="/search/tv">电视剧</a></li><li><ahref="/search/show">综艺</a></li></ul></div> 

想匹配出 电影,电视剧,综艺的链接,形成一个数组

其中,可以看出,该html,是少了最后的div的,实际应该是:

<div class="lib-cat"><h3>分类索引</h3><div class="list"><ul><li><a href="/search/movie">电影</a></li><li><a href="/search/tv">电视剧</a></li><li><a href="/search/show">综艺</a></li></ul></div></div>

格式化后是:

<div class="lib-cat">
  <h3>分类索引</h3>
  <div class="list">
    <ul>
      <li>
        <a href="/search/movie">电影</a>
      </li>
      <li>
        <a href="/search/tv">电视剧</a>
      </li>
      <li>
        <a href="/search/show">综艺</a>
      </li>
    </ul>
  </div>
</div>

【问题解答】

1.对于处理html来说,如果需求相对复杂,即:

不是只是简单的提取1个,2个的字符串之类的

像你这里提取多个字符串的,而且所要处理的html,相对有些规律,且有点复杂的,

建议还是用专门的库去处理,比如BeautifulSoup。

 

具体的解释参见:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

中的:

【整理】关于用正则表达式处理html代码方面的建议

 

关于BeautifulSoup更详细的教程,参见:

Python专题教程:BeautifulSoup详解

 

此处,专门去写完整的代码为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则
http://www.crifan.com/qanda_complicated_requirement_for_process_html_better_use_bs_not_use_re

Author:     Crifan Li
Version:    2013-10-17
Contact:    http://www.crifan.com/about/me/
"""

from BeautifulSoup import BeautifulSoup;

def complex_html_use_bs():
    """"demo how to use beautifulsoup to process complex html"""
    complexHtml = """<div class="lib-cat"><h3>分类索引</h3><div class="list"><ul><li><a href="/search/movie">电影</a></li><li><a href="/search/tv">电视剧</a></li><li><a href="/search/show">综艺</a></li></ul></div></div>""";
    soup = BeautifulSoup(complexHtml, fromEncoding="UTF-8");
    libCatSoup = soup.find(name="div", attrs={"class":"lib-cat"})
    print "libCatSoup=",libCatSoup;
    divUlSoup = libCatSoup.div.ul
    print "divUlSoup=",divUlSoup;
    liSoupList = divUlSoup.findAll("li")
    urlLinkList = []
    for eachLiSoup in liSoupList:
        eachUrlLink = eachLiSoup.a["href"]
        eachLiName = eachLiSoup.a.string
        print "eachLiName=",eachLiName
        print "eachUrlLink=",eachUrlLink
        #urlLinkList.append(eachUrlLink)
    #print "urlLinkList=",urlLinkList;
    
    #Final Output:
    # eachLiName= 电影
    # eachUrlLink= /search/movie
    # eachLiName= 电视剧
    # eachUrlLink= /search/tv
    # eachLiName= 综艺
    # eachUrlLink= /search/show
    
if __name__ == "__main__":
    complex_html_use_bs();

输出为:

complex_html_use_bs.py output in cmd

 

2.对于当前的需求,实际上,如果非要用正则,也是可以的,只是稍微有点麻烦而已。

完整代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则
http://www.crifan.com/qanda_complicated_requirement_for_process_html_better_use_bs_not_use_re

Author:     Crifan Li
Version:    2013-10-17
Contact:    http://www.crifan.com/about/me/
"""

import re

def complex_html_use_re():
    """"demo how to use re to process complex html"""
    complexHtml = """<div class="lib-cat"><h3>分类索引</h3><div class="list"><ul><li><a href="/search/movie">电影</a></li><li><a href="/search/tv">电视剧</a></li><li><a href="/search/show">综艺</a></li></ul></div></div>""";
    liTupleList = re.findall('<li><a href="([^"]+?)">([^<>]+?)</a></li>', complexHtml)
    print "liTupleList=",liTupleList
    for eachTuple in liTupleList:
        urlLink, itemNameUtf8 = eachTuple
        print "urlLink=",urlLink
        itemNameUnicode = itemNameUtf8.decode("utf-8")
        print "itemNameUnicode=",itemNameUnicode
    
    #Final Output:
    # urlLink= /search/movie
    # itemNameUnicode= 电影
    # urlLink= /search/tv
    # itemNameUnicode= 电视剧
    # urlLink= /search/show
    # itemNameUnicode= 综艺
    
if __name__ == "__main__":
    complex_html_use_re();

输出为:

complex_html_use_re output in cmd

 

相关的正则方面的教程,可参考:

正则表达式学习心得

和:

Python专题教程:正则表达式re模块详解

 

【总结】

还是那个建议:

如果处理的html比较复杂,以及所需要处理的需求比较复杂,则还是用专门的库,比如BeautifulSoup,效率比较高;

如果处理相对简单的html,需求也相对简单,还是用正则比较高效和省事;

当然,如果就是不想(依赖)用第三方库,非要用正则,一般都还是可以写出正则表达式的,即够用的,只是针对复杂需求,写出来的正则,很麻烦,很复杂,甚至无法涵盖和处理所有特殊情况罢了;



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量