当前位置: 首页 > 科技观察

比较Python爬虫常用的四种定位元素的方法,你更喜欢哪一种?

时间:2023-03-20 17:38:26 科技观察

在使用Python爬虫采集数据的时候,一个很重要的操作就是如何从请求的网页中提取数据,而正确定位到想要的数据是第一步。本文将比较Python爬虫中常用的几种定位网页元素的方法供大家学习:传统的BeautifulSoup操作是基于BeautifulSoup的CSS选择器(类似于PyQuery)XPath正则表达式参考网页是当当网的畅销书榜:http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1以前20本书的书名为例。首先确认网站没有反爬措施,是否可以直接返回解析内容:importrequestsurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textprint(response)仔细查看,发现返回内容中所有需要的数据,说明不需要特别考虑反-爬行措施。查看网页元素后可以发现li中包含书目信息,进一步查看ulwithclassbang_listclearfixbang_list_mode也可以找到书名对应的位置,这是多种分析方法的重要依据1.传统的BeautifulSoup操作经典的BeautifulSoup方法使用frombs4importBeautifulSoup,然后通过soup=BeautifulSoup(html,"lxml")将文本转换成特定的标准化结构,并使用find系列方法进行解析,代码如下如下:importrequestsfrombs4importBeautifulSoupurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textdefbs_for_parse(response):soup=BeautifulSoup(response,"lxml")li_list=soup.find('ul',class_='bang_listclearfixbang_list_mode').find_all('li')#锁定后得到20个liforliinli_listul:title=li.find('div',class_='name').find('a')['title']#解析得到书名一一print(title)if__name__=='__main__':bs_for_parse(response)成功获取了20个书名,部分书名较长,可以传正则或其他字符2、基于BeautifulSoup的CSS选择器这种方法其实就是PyQuery中的CSS选择器在其他模块中的迁移和使用,用法类似CSS选择器的详细语法可以参考:http://www.w3school.com.cn/cssref/css_selectors.asp由于是基于BeautifulSoup,导入的模块和文本结构转换是一致的:importrequestsfrombs4importBeautifulSouurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textdefcss_for_parse(response):soup=BeautifulSoup(response,"lxml")print(soup)if__name__=='__main__':css_for_parse(response)然后通过soup.select获取具体的内容辅以具体的CSS语法,基础还是仔细查看分析元素:importrequestsfrombs4importBeautifulSoupfromxmlimporthtmlurl='http://砰。当当网/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textdefcss_for_parse(response):soup=BeautifulSoup(response,"lxml")li_list=soup.select('ul.bang_list.clearfix.bang_list_mode>li')forliinli_list:title=li.select('div.name>a')[0]['title']print(title)if__name__=='__main__':css_for_parse(响应)3。XPathXPath即XML路径语言,是一种用来确定XML文档中某部分位置的计算机语言。如果使用Chrome浏览器,建议安装XPathHelpr插件会大大提高编写XPath的效率。之前的爬虫文章基本都是基于XPath的,大家比较熟悉,所以直接给出代码:importrequestsfromlxmlimporthtmlurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textdefxpath_for_parse(response):selector=html.fromstring(response)books=selector.xpath("//ul[@class='bang_listclearfixbang_list_mode']/li")forbookinbooks:title=book.xpath('div[@class="name"]/a/@title')[0]print(title)if__name__=='__main__':xpath_for_parse(response)4.正则表达式如果你不熟悉HTML语言,前面的解析方式会比较吃力。这里也提供了一种通用的分析方法:正则表达式,你只需要关注文本本身的特殊结构语法,就可以使用特定的规则来获取相应的内容。依赖模块是re。先重新观察一下直接返回的内容,需要的文字前后有什么特别的:importrequestsimportreurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textprint(response)观察几个数字,相信会有答案:书名隐藏在上面的字符串中,包含的URL链接末尾的数字会随着书名的变化而变化。这里解析后可以写正则表达式:importrequestsimportreurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url).textdefre_for_parse(response):reg=''fortitleinre.findall(reg,response):print(title)if__name__=='__main__':re_for_parse(response)可以发现正则的写法是最简单的,但是需要非常精通正则。所谓正则法好!当然,无论哪种方法都有其适用的场景,在实际操作中,我们还需要通过分析网页的结构来判断如何高效定位元素,最后附上本文介绍的四种方法的完整代码,各位可以自己操作加深体验importrequestsfrombs4importBeautifulSoupfrommlxmlimporthtmlimportreurl='http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-24hours-0-0-1-1'response=requests.get(url)。textdefbs_for_parse(response):soup=BeautifulSoup(response,"lxml")li_list=soup.find('ul',class_='bang_listclearfixbang_list_mode').find_all('li')forliinli_list:title=li.find('div',class_='name').find('a')['title']print(title)defcss_for_parse(response):soup=BeautifulSoup(response,"lxml")li_list=soup.select('ul.bang_list.clearfix.bang_list_mode>li')forliinli_list:title=li.select('div.name>a')[0]['title']print(title)defxpath_for_parse(response):selector=html.fromstring(response)books=selector。xpath("//ul[@class='bang_listclearfixbang_list_mode']/li")forbookinbooks:title=book.xpath('div[@class="name"]/a/@title')[0]print(title)defre_for_parse(关于sponse):reg=''fortitleinre.findall(注册,响应):打印(标题)if__name__=='__main__':#bs_for_parse(响应)#css_for_parse(响应)#xpath_for_parse(响应)re_for_parse(响应)