美文网首页
学习lxml和xpath

学习lxml和xpath

作者: 伍只蚊 | 来源:发表于2017-07-27 17:05 被阅读182次

    xml是一种标记语法的文本格式,xpath可以方便的定位xml中的元素和其中的属性值。html也属于标记语言,可以用xpath来获取想要的对象和属性。
    lxml是python中的一个包,这个包中包含了将html文本转成xml对象,和对对象执行xpath的功能。

    以下是xpath的常用路径选择语法:

    • 节点名 选取此节点下的所有子节点
    • / 从根节点选取
    • // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    • @ 选取属性

    以下是一个练习,爬取,贴吧的图片:

    思路:

    1. 根据url变化写出,列表页的url表达式

    2. 访问列表页,通过xpah获取每条内容的链接

    3. 通过连接进入详情页,获取其中的图片链接

    4. 通过图片src 访问图片,并保存在本地

    这里讲一个大坑

    从浏览器中通过xpath,能匹配到


    enter description hereenter description here

    但是在代码中运行却不能,
    经过一番折腾终于发现了,查看response文本,
    竟然发现body部分被注释掉了,那么取消掉注释就可以匹配到了。

    # coding=utf8
    
    import urllib
    import urllib2
    from lxml import etree
    
    
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
    def load_page(url):
        """
        作用:根据url发送请求,获取服务器相应文件
        url: 需要爬取的url地址
        """
    
        request = urllib2.Request(url,headers=headers)
    
    
        response = urllib2.urlopen(request).read().replace('<!--','').replace('--!>','')
        # with open('sss.html','w') as f:
        #     f.write(response)
    
        links =  etree.HTML(response).xpath(r'//div[@class="t_con cleafix"]/div/div/div/a/@href')
        print links
        for link in links:
            load_img(link)
            print('*************')
            print link
    
    def load_img(link):
    
        url = 'https://tieba.baidu.com'+link
    
        request = urllib2.Request(url,headers=headers)
        response = urllib2.urlopen(request).read()
        # with open('s.html','w') as f:
        #     f.write(response)
        my_xml = etree.HTML(response)
        img_list = my_xml.xpath(r'//img[@class="BDE_Image"]/@src')
        for img_src in img_list:
            write_img(img_src)
    
    def write_img(src):
        request = urllib2.Request(src,headers=headers)
        response = urllib2.urlopen(request).read()
        with open('img/'+src[-15:],'wb') as f:
            f.write(response)
    
    def tieba_spider(url,bagin_page,end_page):
        '''
        作用;贴吧爬虫调度器,负责组合处理每个页面的url
        url :贴吧url前部分
    
        '''
    
        #每一页一页的爬,用for
        for i in range(bagin_page,end_page+1):
            pn = (i-1)*50 #这里是百度贴吧表示 页码的方式
            ful_url = url +'&pn=' +str(pn)
            print ful_url
            file_name = '第' + str(i) +'页.html'
            #调用load_page
            load_page(ful_url)
    
    
    
    if __name__ == '__main__':
        kw = raw_input("输入贴吧名:")
        begain_page = int(raw_input('起始页:'))
        end_page = int(raw_input('输入结束页'))
    
        url ='https://tieba.baidu.com/f?'
        key = urllib.urlencode({'kw':kw})
    
        ful_url = url  +key
    
        tieba_spider(ful_url,begain_page,end_page)
    
    

    这样就爬取了文章中的图片了:


    enter description hereenter description here

    总结:

    1. 通过xpth获取节点时,要分析html结构。
    2. 浏览器上和用urlopen获得的html会有不同,以response为准
    3. lmxl具有xpath功能

    相关文章

      网友评论

          本文标题:学习lxml和xpath

          本文链接:https://www.haomeiwen.com/subject/zgzzkxtx.html