Home

韧桂

思考,总结

利用 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