【问题】
的:
想匹配出 电影,电视剧,综艺的链接,形成一个数组 |
其中,可以看出,该html,是少了最后的div的,实际应该是:
1 | < 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | < 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更详细的教程,参见:
此处,专门去写完整的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/usr/bin/python # -*- coding: utf-8 -*- """ Function: 【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则 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.对于当前的需求,实际上,如果非要用正则,也是可以的,只是稍微有点麻烦而已。
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #!/usr/bin/python # -*- coding: utf-8 -*- """ Function: 【问题解答】建议:处理html时复杂的需求,建议使用专门的库比如BeautifulSoup去处理而不要用正则 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去处理而不要用正则