前言
文章是基于哔哩哔哩UP主 林粒粒呀 的爬虫教学视频的学习笔记,供大家学习参考交流。文章写的一般,视频讲解更为通俗易懂,十分感谢 林粒粒呀。视频链接:【【Python+爬虫】爆肝两个月!拜托三连了!这绝对是全B站最用心(没有之一)的Python+爬虫公开课程,从入门到(不)入狱 !】
友情提示:该视频第二节为Python基础教学,了解Python的同志可以直接跳过,实际上关于爬虫的时间只有1小时。
requests库的使用
介绍:
我们通过向使用脚本模拟用户网站服务器发送请求,让网站服务器自己将网站信息发送到我们的过程就是爬虫.
为了实现向服务器发送请求的功能,我们使用Python的第三方库requests.一般向服务器发送的请求有Get请求和Post请求,前者用于向服务器请求网站数据,后者用于向服务器发送数据,明显我们在爬虫中主要用到的是Get请求,因此下面我们首先介绍request库中的Get请求.
Get请求
import requests
response = requests.get('https://baidu.com') # 发送Get请求的函数时get函数,其中需要传入的参数是想要爬取数据的网址
print(response) # 使用get方法后会返回一个Response实例,该实例后面中括号内的数字代表状态码
<Response [200]>
Response常见的属性
status_code: 状态码
- 200族:成功
- 200:请求成功
- 204:请求成功,但无结果返回
- 300族:重定向
- 301:永久重定向
- 302:临时重定向
- 400族:客户端错误
- 400:请求报文存在语法错误
- 401:需要认证或者认证失败
- 403:请求被服务器拒绝了
- 404:服务器上无法找到请求的资源
- 418:服务器反爬虫
- 500族:服务器错误
- 501:服务端执行请求时发生了错误
- 503:服务器正在超负载或者停机维护,无法处理请求
ok: 请求是否成功 如果访问成功 (状态码为2xx) 则ok的值为True 否则为False
text: 请求得到的内容
if response.ok:
print("成功爬取到网站数据")
print(response.text) # HTML形式
else:
print("失败")
成功爬取到网站数据
<!doctype html><html lang="zh" dir="ltr"><head><meta name="theme-color" content="#4F4F4F" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>必应</title><link rel="preconnect" href="https://r.bing.com" /><link rel="preconnect" href="https://r.bing.com" crossorigin/><link rel="dns-prefetch" href="https://r.bing.com" /><link rel="dns-prefetch" href="https://r.bing.com" crossorigin/><link rel="stylesheet" href="/rp/RCJCS6O5TykkUhXX1pwc6RsdyuI.gz.css" type="text/css"/><script type="text/javascript">//<![CDATA[
var logJSText=function(n,t){t===void 0&&(t=null);(new Image).src=_G.lsUrl+'&Type=Event.ClientInst&DATA=[{"T":"CI.ClientInst","FID":"CI","Name":"'+escape(n)+(t?'","Text":"'+escape(t):"")+'"}]'},getHref=function(){return location.href};try{var ignErr=["ResizeObserver loop","Script error"],maxErr=3,ignoreCurrentError=function(n,t){return ignErr.some(function(t){return n.includes(t)})?(t!=null&&(typeof sj_sp!="undefined"&&sj_sp(t),typeof sj_pd!="undefined"&&sj_pd(t)),!0):!1},regexEsc=function(n){return n.replace(/([.?*+^$&[\]\\(){}|<>-])/g,"\\$1")};window.jsErrorHandler=function(n){var f,p,h,rt,ut,u,e,ft,o,a,v,s;try{if(f='"noMessage"',p=(n.error||n).message||f,ignoreCurrentError(p,n))return;if(h=(window.ERC?window.ERC:0)+1,window.ERC=h,h>maxErr){logJSText("max errors reached");return}var c=n.error||n,w=n.filename,b=n.lineno,k=n.colno,d=n.extra,l=c.severity||"Error",g=c.message||f,i=c.stack,t='"'+escape(g.replace(/"/g,""))+'"',nt=new RegExp(regexEsc(getHref()),"g"),tt=window.lirab,it=window.liraa,r=tt?" hint == ["+tt:"";if(r=r+(it?", "+it+")":r?"]":""),i){for(rt=/\(([^\)]+):[0-9]+:[0-9]+\)/g,u={};(ut=rt.exec(i))!==null;)e=ut[1],u[e]?u[e]++:u[e]=1;o=0;for(a in u)u[a]>1&&(v=regexEsc(a),ft=new RegExp(v,"g"),i=i.replace(ft,o),i+="#"+o+"="+v,o++);i=i.replace(nt,"self").replace(/"/g,"");t+=',"Stack":"'+(escape(i)+'"')}if(w?t+=',"Meta":"'+escape(w.replace(nt,"self"))+r+'"':r&&(t+=',"Meta":"'+r+'"'),b&&(t+=',"Line":"'+b+'"'),k&&(t+=',"Char":"'+k+'"'),d&&(t+=',"ExtraInfo":"'+d+'"'),g===f)if(l="Warning",t+=',"ObjectToString":"'+n.toString()+'"',JSON&&JSON.stringify)t+=',"JSON":"'+escape(JSON.stringify(n))+'"';else for(s in n)n.hasOwnProperty(s)&&(t+=',"'+s+'":"'+n[s]+'"');var et=(new Date).getTime(),ot='"T":"CI.'+l+'","FID":"CI","Name":"JS'+l+'","Text":'+t+"",st="<E><T>Event.ClientInst<\/T><IG>"+_G.IG+"<\/IG><TS>"+et+"<\/TS><D><![CDATA[[{"+ot+"}]]\]><\/D><\/E>",ht="<ClientInstRequest><Events>"+st+"<\/Events><STS>"+et+"<\/STS><\/ClientInstRequest>",y=new XMLHttpRequest;y.open("POST","/fd/ls/lsp.aspx?",!0);y.setRequestHeader("Content-Type","text/xml");y.send(ht);typeof sj_evt!="undefined"&&sj_evt.fire("ErrorInstrumentation",t)}catch(ct){logJSText("MetaJSError","Failed to execute error handler. "+ct.message)}};window.addEventListener&&(window.addEventListener("error",window.jsErrorHandler,!1),window.addEventListener("unhandledrejection",window.jsErrorHandler,!1))}catch(e){logJSText("MetaJSError","Failed to bind error handler "+e.message)};
//]]></script></head><body><div class="hp_body"><div class="hpl hp_cont"><div class="sbox"><form action="/search" id="sb_form" class="sb_form"><input id="sb_form_q" class="sb_form_q" name="q"
placeholder="" type="search" maxlength="1000" autocapitalize="off" autocomplete="off" spellcheck="false"
title="输入搜索词" autofocus="autofocus" ) /><input id="sb_form_go" type="submit"
title="搜索" name="search" value=""
tabIndex="0" /><label for="sb_form_go" class="search icon tooltip" aria-label="搜索网页"><svg viewBox="0 0 25 25" enable-background="new 0 0 25 25"><path stroke="#007DAA" stroke-width="2.5" stroke-linecap="round" stroke-miterlimit="10" fill="none" d="M23.75 23.75l-9-9" /><circle stroke="#007DAA" stroke-width="2.5" stroke-linecap="round" stroke-miterlimit="10" cx="9" cy="9" r="7.75" fill="none" /><path fill="none" d="M25 25h-25v-25h25z" /></svg></label><input type="hidden" value="QBLH" name="form" /></form><a id="hpinsthk" aria-hidden="true" tabindex="-1" href="javascript:void(0);" h="ID=SERP,5065.1"><span></span></a></div></div><div class="hpl bottom_row"><div class="scroll_cont" id="scroll_cont"><footer class="footer no_mod " id="footer"><div class="footerbody "><span class="msft">© 2024 Microsoft</span><ul class="items"><li class="item"><a id="ICPLicense" href="https://dxzhgl.miit.gov.cn/dxxzsp/xkz/xkzgl/resource/qiyereport.jsp?num=caf04fa4-bd8a-4d9e-80b6-2aa1b86c1509&type=yreport" h="ID=SERP,5066.1">增值电信业务经营许可证:合字B2-20090007</a></li><li class="item"><a id="ICPFiling" href="https://beian.miit.gov.cn" h="ID=SERP,5067.1">京ICP备10036305号-7</a></li><li class="item"><a id="MMAIS" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802022657" h="ID=SERP,5068.1">京公网安备11010802022657号</a></li><li class="item"><a id="privacy" href="//go.microsoft.com/fwlink/?LinkId=521839" h="ID=SERP,5069.1">隐私与 Cookie</a></li><li class="item"><a id="legal" href="//go.microsoft.com/fwlink/?LinkID=246338" h="ID=SERP,5070.1">法律声明</a></li><li class="item"><a id="" href="//go.microsoft.com/fwlink/?linkid=868923" h="ID=SERP,5071.1">广告</a></li><li class="item"><a id="" href="//go.microsoft.com/fwlink/?LinkID=286759" h="ID=SERP,5072.1">关于我们的广告</a></li><li class="item"><a id="help" href="//support.microsoft.com/topic/82d20721-2d6f-4012-a13d-d1910ccf203f" h="ID=SERP,5073.1">帮助</a></li><li class="item"><a id="sb_feedback" href="#" h="ID=SERP,5074.1">反馈</a></li></ul></div></footer></div></div></div><script type="text/javascript" crossorigin="anonymous" src="https://r.bing.com/rs/6r/fU/jnc,nj/tlifxqsNyCzxIJnRwtQKuZToQQw.js?or=n"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/CCDMqxaLQmaaR8fRII7Bqy0tqS8.gz.js"></script><script type="text/javascript">//<![CDATA[
_G={Region:"CN",Lang:"zh-CN",ST:(typeof si_ST!=='undefined'?si_ST:new Date),Mkt:"zh-CN",RevIpCC:"cn",RTL:false,Ver:"31",IG:"86BA75949C6B43F2A6E962F548372215",EventID:"66afb17c5b0f4f76aeb19384c5f4a65a",V:"homepage",P:"SERP",DA:"MWHE01",CID:"2D6036E6D9C565BD1E8B2237D8A36469",SUIH:"TsdsIwu-eDyAalLCXFP-KA",adc:"b_ad",EF:{bmasynctrigger:1,getslctspt:1,newtabsloppyclick:1,chevroncheckmousemove:1,sharepreview:1,shareoutimage:1,sharefixreadnum:1,sharepreviewthumbnailid:1,shareencodefix:1,infrefcflog:1,chatskip2content:1},gpUrl:"\/fd\/ls\/GLinkPing.aspx?" }; _G.lsUrl="/fd/ls/l?IG="+_G.IG+"&CID="+_G.CID ;curUrl="https:\/\/cn.bing.com\/";function si_T(a){ if(document.images){_G.GPImg=new Image;_G.GPImg.src=_G.gpUrl+'IG='+_G.IG+'&CID='+_G.CID+'&'+a;}return true;}_G.BAT="0";_G.NTT="600000";_G.RTO="172800000";_G.CTT="3000";_G.BNFN="Default";_G.LG="160";_G.FilterFlareInterval=5;;
//]]></script><script type="text/javascript" crossorigin="anonymous" src="/rp/5WG_kDsbFabhsuv_6NwDoh2LdnI.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/ACby6guiuiyuEYRTFOH8no-JKCo.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/sTqO8BLDL3SMwm5-DmlL0eodCJk.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/PVEp6LmF7FGQF4_wW3Ri1trRPv4.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/oJtq_u9TBV7TshzGOx6yvnobEEU.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/PrUVzF4hlCEHR6XAp8AR6euT5OM.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/qN3rmGYj9Qsn6JmjzmYclpmfCHI.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/omjewb8RA_1ed-86jqIwN_f_ON8.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/9RU9Mo45ZvCytDGnLCWS0LulULU.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/svYzgo4yD9vzUlVytiD-v2lepRM.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="https://r.bing.com/rb/5T/jnc,nj/Fou4y5flZC_CJaDKeDfmSjHvbYI.js?bu=BbAEtAS2BPUDnwQ&or=n"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/ICf9X-WMafiZOnS_3M9RpM8994E.gz.js"></script><script type="text/javascript" crossorigin="anonymous" src="/rp/nIt_N_kpXwbKZc4NbcR2zfSrv0E.gz.js"></script><script type="text/javascript">//<![CDATA[
_w.rms.js({'A:rms:answers:Shared:BingCore.Bundle':'\/rp\/rpcyRzJEvxW5U0j4COb_L6wpZrE.gz.js'},{'A:rms:answers:Feedback:FeedbackAccessibility':'\/rp\/peNl4yUB4P3PwDM4J7NWGzi8hKM.gz.js'},{'A:AppendHTML':'https:\/\/r.bing.com\/rs\/6r\/lA\/nj\/pxzfjFIjWTDQikh0A5aT_cguYyc.js?or=n'},{'A:AjaxLoad':'https:\/\/r.bing.com\/rs\/6r\/lO\/nj\/EmG-XMIMCcq8zmcVBBO7jkFERAE.js?or=n'},{'A:rms:answers:Feedback:FeedbackBootstrapBundle':'\/rp\/aOA7a7jg_SiOo7Z1-2J6mbS36HE.gz.js'},{'A:0':0},{'A:rms:answers:BoxModel:Rules':'\/rp\/N0NZj2UoTgAcpHMO-3FYmE5C7G4.gz.js'},{'A:rms:answers:BoxModel:TriggerFirstChunk':'\/rp\/iuYNUHE3kZrz6Jrb0_Mf0yBFZN0.gz.js'},{'A:rms:answers:BoxModel:ViewportQueue':'\/rp\/8srl0LOx92Ew0yyAq2m2e33cq7I.gz.js'},{'A:rms:answers:BoxModel:LayoutQueue':'\/rp\/Mt62GUgrdySmO3Hz6WvsY51OVCM.gz.js'},{'A:rms:answers:BoxModel:EventQueue':'\/rp\/8AigLIxHhxH6NCSV3aSsPWpKiRs.gz.js'},{'A:rms:answers:BoxModel:Framework':'\/rp\/4MCFBjxWsxXmwf7cMyCurAAEJUw.gz.js'});;
//]]></script><div id="aRmsDefer"><script type="text/rms">//<![CDATA[
Feedback.Bootstrap.InitializeFeedback({page:true},"sb_feedback",1,0,0);;
//]]></script></div></body></html>
爬虫访问豆瓣 - 避开反爬虫程序
import requests
response = requests.get("https://movie.douban.com/top250")
print(response)
# 返回状态码418 表示遇到了反爬虫
# 由于豆瓣等部分网址为了让自家服务器只服务于真实用户,其拒绝了所有爬虫的请求,为了爬取这些网站的数据,我们可以模拟真实用户
<Response [418]>
# 给定请求头 模拟真实用户 避开反爬虫程序
header = {'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36 Edg/127.0.0.0'}
response = requests.get("https://movie.douban.com/top250",headers = header)
print(response)
# 返回状态码200 说明正常爬取到了网站数据
<Response [200]>
HTML
**说明:**通过get请求爬取到的网站数据是html,通常我们想要的只是某个网址中的部分信息,而非整个网址的数据,为了能够从html中获得我们想要的内容,我们需要对html有一定的了解
网址爬取的HTML示例
下面我们给出百度首页爬取到的html数据.在下面的每一个用<>括起来的内容我们称之为标签
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta http-equiv=content-type content=text/html;charset=utf-8>
<meta http-equiv=X-UA-Compatible content=IE=Edge>
<meta content=always name=referrer>
<link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css>
<title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title>
</head>
<body link=#0000cc>
<div id=wrapper>
<div id=head>
<div class=head_wrapper>
<div class=s_form>
<div class=s_form_wrapper>
<div id=lg> <img hidefocus=true src=https://img-home.csdnimg.cn/images/20230724024159.png?be=1&origin_url=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div>
<form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form>
</div>
</div>
<div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ–°é—»</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript>
<script>
document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=' + encodeURIComponent(window.location.href + (window.location.search === "" ? "?" : "&") + "bdorz_come=1") + '" name="tj_login" class="lb">登录</a>');
</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产å“</a>
</div>
</div>
</div>
<div id=ftCon>
<div id=ftConw>
<p id=lh> <a href=http://home.baidu.com>å
³äºŽç™¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p>
<p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty />使用百度å‰å¿
读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æ„è§å馈</a> 京ICPè¯030173å· <img src=https://img-home.csdnimg.cn/images/20230724024159.png?be=1&origin_url=https://img-home.csdnimg.cn/images/20230724024159.png?be=1&origin_url=//www.baidu.com/img/gs.gif> </p>
</div>
</div>
</div>
</body>
</html>
展示结果
©2017 Baidu 使用百度å‰å¿ 读 æ„è§å馈 京ICPè¯030173å·
HTML常用标签
标题标签
【数字代表标签为几级标签,一般数字越大字体越小】
<h1> 这是一个一级标签 </h1>
<h2> 这是一个二级标签 </h2>
<h3> 这是一个三级标签 </h3>
<h4> 这是一个四级标签 </h4>
<h5> 这是一个五级标签 </h5>
<h6> 这是一个六级标签 </h6>
这是一个一级标签
这是一个二级标签
这是一个三级标签
这是一个四级标签
这是一个五级标签
这是一个六级标签
文本标签
普通文本 <p> content </p>
<p>这是一个文本标签 </p>
<p>给岁月以文明 </p>
<p>而不是给文明以岁月 </p>
这是一个文本标签
给岁月以文明
而不是给文明以岁月
换行标签<br>
<p>给岁月以文明\<br>而不是给文明以岁月 </p>
给岁月以文明
而不是给文明以岁月
加粗标签 <b> content </b>
<p>展示加粗字体:<b>加粗</b></p>
展示加粗字体:加粗
斜体标签 <i> content </i>
<p>展示斜体字体:<i>斜体</i></p>
展示斜体字体:斜体
下划线标签 <u> content </u>
图片标签 <img src [width,height] >
网址标签 <a href > 网址重定义名 </a>
<a href='http://www.4399.com'>4399大游戏(本页打开)</a>
<a href='http://www.4399.com' target ='_blank'>4399大游戏(新页打开)</a>
容器标签
div元素 一行一个 <div> contents </div>
span元素 一行可多个 <span> contents </span>
列表标签
有序列表 <ol> <li> content </li></ol>\
HTML源码
<ol>
<li> 语文 </li>
<li> 数学 </li>
<li> 英语 </li>
</ol>
展示结果
- 语文
- 数学
- 英语
无序列表 <ul> <li> content </li></ul>\
HTML源码
<ul>
<li> 语文 </li>
<li> 数学 </li>
<li> 英语 </li>
</ul>
展示结果
- 语文
- 数学
- 英语
表格标签
HTML源码
<table> # 表格开始标签
<thead> # t head 表头开始标签(一般为表格第一行的表头)
<tr> # t row 表格行标签
<td>表头1</td> # t data 表格内容标签
<td>表头2</td>
</tr>
</thead>
<tbody> # t body 表格主体标签(一般为表格内容)
<tr>
<td>Value11</td> # 表格内容标签
<td>Value12</td>
</tr>
<tr>
<td>Value21</td>
<td>Value22</td>
</tr>
</tbody>
</table> # 表格结束标签
展示结果
表头1 | 表头2 |
Value11 | Value12 |
Value21 | Value22 |
HTML案例
<!DOCTYPE html>
<html>
<head>
<title>网页浏览器显示的标题</title>
</head>
<body>
<h1>Python</h1>
<h2>爬虫学习</h2>
<p><b>学习时间:</b><br><i>2024年08月04日</i></p>
<img scr='https://img-s-msn-com.akamaized.net/tenant/amp/entityid/AA1ocyJX.img?w=612&h=399&m=6' width='200px'>
<a href='http://www.4399.com'>4399大游戏(本页打开)</a>
<a href='http://www.4399.com' target ='_blank'>4399大游戏(新页打开)</a>
<span>
<p>测试数据1</p>
</span>
<span>
<p>测试数据2</p>
</span>
<div>
<p>测试数据1</p>
<p>测试数据2</p>
</div>
<table>
<thead>
<tr>
<td>姓名</td>
<td>语文</td>
<td>数学</td>
<td>英语</td>
</tr>
</thead>
<tbody>
<tr>
<td>小明</td>
<td>92</td>
<td>99</td>
<td>98</td>
</tr>
<tr>
<td>小帅</td>
<td>87</td>
<td>60</td>
<td>58</td>
</tr>
</tbody>
</table>
</body>
</html>
展示结果
Python
爬虫学习
学习时间:
2024年08月04日
测试数据1
测试数据2
测试数据1
测试数据2
姓名 | 语文 | 数学 | 英语 |
小明 | 92 | 99 | 98 |
小帅 | 87 | 60 | 58 |
Beautiful Soup HTML解析库
说明:
我们通过之前的学习可以发现,爬取到的html可能会很复杂,很难看懂,因此我们借助bs4库中的BeautifulSoup帮助我们完成对HTML的解析以及内容的查找
安装
pip install bs4
使用
from bs4 import BeautifulSoup
import requests
content = requests.get('http://books.toscrape.com/').text
soup = BeautifulSoup(content,'html.parser')
# 获取第一个指定类型的标签元素
print('获取到的数据中第一个文本标签是\n',soup.p) # 获取第一个文本标签元素
print('获取到的数据中第一个一级标签是\n',soup.h1)
# 根据条件查找全局中所有符合要求的元素
print('使用findAll查找元素')
all_prices = soup.findAll('p',attrs={'class':'price_color'})
for i in all_prices:
# print(i) # 默认返回的是标签
print(i.string) # 使用标签的string属性返回元素内容
获取到的数据中第一个文本标签是
<p class="star-rating Three">
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
</p>
获取到的数据中第一个一级标签是
<h1>All products</h1>
使用findAll查找元素
£51.77
£53.74
£50.10
£47.82
£54.23
£22.65
£33.34
£17.93
£22.60
£52.15
£13.99
£20.66
£17.46
£52.29
£35.02
£57.25
£23.88
£37.59
£51.33
£45.17