【问题】
的:
<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#等)
中的:
关于BeautifulSoup更详细的教程,参见:
此处,专门去写完整的代码为:
#!/usr/bin/python # -*- coding: utf-8 -*- """ Function: 【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则 https://www.crifan.com/qanda_complicated_requirement_for_process_html_better_use_bs_not_use_re Author: Crifan Li Version: 2013-10-17 Contact: https://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();
输出为:
2.对于当前的需求,实际上,如果非要用正则,也是可以的,只是稍微有点麻烦而已。
完整代码:
#!/usr/bin/python # -*- coding: utf-8 -*- """ Function: 【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则 https://www.crifan.com/qanda_complicated_requirement_for_process_html_better_use_bs_not_use_re Author: Crifan Li Version: 2013-10-17 Contact: https://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();
输出为:
相关的正则方面的教程,可参考:
和:
【总结】
还是那个建议:
如果处理的html比较复杂,以及所需要处理的需求比较复杂,则还是用专门的库,比如BeautifulSoup,效率比较高;
如果处理相对简单的html,需求也相对简单,还是用正则比较高效和省事;
当然,如果就是不想(依赖)用第三方库,非要用正则,一般都还是可以写出正则表达式的,即够用的,只是针对复杂需求,写出来的正则,很麻烦,很复杂,甚至无法涵盖和处理所有特殊情况罢了;
转载请注明:在路上 » 【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则