xpath获取标签的属性值_Python爬⾍:现学现⽤xpath爬取⾖
瓣⾳乐
爬⾍的抓取⽅式有好⼏种,正则表达式,Lxml(xpath)与BeautifulSoup,我在⽹上查了⼀下资料,了解到三者之间的使⽤难度与性能
三种爬⾍⽅式的对⽐。
这样⼀⽐较我我选择了Lxml(xpath)的⽅式了,虽然有三种⽅式,但肯定是要选择最好的⽅式来爬⾍,这个道理⼤家都懂,另外有兴趣的朋友也可以去了解另外两种爬⾍⽅式!
好了现在来讲讲xpath
由于Xpath属于lxml模块,所以⾸先需要安装lxml库,⽼办法直接在file-->setting---project interpreter ⼀键添加lxml库。
xpath简单⽤法
from lxml import etree
s=etree.HTML(源码) #将源码转化为能被XPath匹配的格式
s.xpath(xpath表达式) #返回为⼀列表,
基础语法:
1、// 双斜杠 定位根节点,会对全⽂进⾏扫描,在⽂档中选取所有符合条件的内容,以列表的形式返回。
2、/ 单斜杠 寻当前标签路径的下⼀层路径标签或者对当前路标签内容进⾏操作
3、/text() 获取当前路径下的⽂本内容
4、/@xxxx 提取当前路径下标签的属性值
5、| 可选符 使⽤|可选取若⼲个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
6、. 点 ⽤来选取当前节点
7、.. 双点 选取当前节点的⽗节点
获取单条数据
1.获取⾳乐标题
打开⽹址,按下F12,然后查标题,右键弹出菜单栏 Copy==> Copy Xpath
这⾥我们想获取⾳乐标题,⾳乐标题的xpath是:xpath://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a
运⾏代码:
居然是空的。
这⾥需要注意⼀下,浏览器复制的xpath只能作参考,因为浏览器经常会在⾃⼰⾥⾯增加多余的tbody标签,我们需要⼿动把这个标签删除
删除中间的/tbody后,是这样的,
title = s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div/a')
然后我们再运⾏代码。
得到:
说明标题被获取到了。
因为要获取标题⽂本,所以xpath表达式要追加/text()
title = s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div/a/text()')#因为要获取标题,所以我需要这个当前路径下的⽂本,所以使⽤/text()
⼜因为这个s.xpath返回的是⼀个集合,且集合中只有⼀个元素所以我再追加⼀个[0]
新的表达式:
title = s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div/a/text()')[0]#因为要获取标题,所以我需要这个当前路径下的⽂本,所以使⽤/text(),再追加[0]
重新运⾏得到结果:
爬虫可以干什么
We Sing. We Dance. We Steal Things.
正是我们想要的标题。
2.获取⾳乐评分与评价⼈数
⽼办法,先⽤右键copy评分的xpath ://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/div/spa
n[2]复制评价⼈数的xpath://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/div/span[3]/text()
同样的我们要把tbody去掉,然后重新运⾏代码:
得到:
We Sing. We Dance. We Steal Things.
9.1
(
100395⼈评价
)
3.获取⾳乐链接
copy标题的xpath,://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a
想获取⾳乐连接href这⾥需要,获取这个标签属于,/@xxx可以提取当前路径标签下的属性值
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a/@href
代码:
5.获取图⽚地址:
到图⽚,复制他的xpath地址://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[1]/a/img
运⾏代码:
完整代码(获取多个页⾯多个数据)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。