利用 xpath 解析,爬取豆瓣音乐
# coding:utf-8
from lxml import etree
import requests
#获取页面地址
def getUrl():
for i in range(10):
url = 'https://music.douban.com/top250?start={}'.format(i*25)
scrapyPage(url)
#爬取每页数据
def scrapyPage(url):
html = requests.get(url).text
s = etree.HTML(html) #s=etree.HTML(源码) 将源码转化为能被XPath匹配的格式
trs = s.xpath('//*[@id="content"]/div/div[1]/div/table/tr')#s.xpath(xpath表达式) 返回为一列表,#精简一下xpath路径,先提取tr之前的节点集合
for tr in trs: #遍历tr
href = tr.xpath('./td[2]/div/a/@href')[0]#链接在标题标签href属性中
#注意新节点是tr下的节点。「.」选取当前节点
title = tr.xpath('./td[2]/div/a/text()')[0]
'''
/tbody 标签删除.因为要获取标题,所以我需要这个当前路径下的文本,所以使用/text().
又因为这个s.xpath返回的是一个集合,且集合中只有一个元素所以我再追加一个[0]。 #添加个[0], 因为 xpath() 返回的结果是列表类型。我以获取标题内容为例子讲解不添加[0]会出现什么问题。那么代码则变为,运行结果会返回一个列表,而不是文本信息。
'''
score = tr.xpath('./td[2]/div/div/span[2]/text()')[0]
number = tr.xpath('./td[2]/div/div/span[3]/text()')[0]
img = tr.xpath('./td[1]/a/img/@src')[0]
#对比他们的xpath,发现只有table序号不一样,我们可以就去掉序号,得到通用的xpath信息:
#print(href,title,score,numbers,imgs)
#for i in range(25):
#print(hrefs[i],titles[i],scores[i],numbers[i],imgs[i])
print(href, title, score, number, img)
if '__main__':
getUrl()
"""
/ #从当前节点选取直接子节点
// #从当前节点选取子孙节点
. #选取当前节点
.. #选取当前节点的父节点
@ #选取属性
//title[@lang='eng'] #选择所有名称为 title ,同时属性 lang 的值为 eng 的节点
//*[@lang='eng'] #选择属性 lang 的值为 eng 的节点
"""
欢迎关注我的公众号:「韧桂」
韧桂 2018-09-01