最新消息:20210917 已从crifan.com换到crifan.org

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

Python crifan 2286浏览 0评论

【问题】

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去处理而不要用正则
【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则
Author: Crifan Li Version: 2013-10-17 Contact: https://www.crifan.org/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去处理而不要用正则
【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则
Author: Crifan Li Version: 2013-10-17 Contact: https://www.crifan.org/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,需求也相对简单,还是用正则比较高效和省事;

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

转载请注明:在路上 » 【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
93 queries in 0.182 seconds, using 23.32MB memory