zoukankan      html  css  js  c++  java
  • 利用python脚本(xpath)抓取数据

    有人会问re和xpath是什么关系?如果你了解js与jquery,那么这个就很好理解了。

    上一篇:利用python脚本(re)抓取美空mm图片

    # -*- coding:utf-8 -*-
    from lxml import etree
    
    html = """
        <!DOCTYPE html>
        <html>
            <head lang="en">
            <title>我的文档</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            </head>
            <body>
                <div id="cctv">
                    <div class="content">
                        <ul id="ul">
                            <li>NO.1</li>
                            <li>NO.2</li>
                            <li>NO.3</li>
                        </ul>
                        <ul id="ul2">
                            <li><span class="ctv">one</span></li>
                            <li><span class="ctv">two</span></li>
                        </ul>
                    </div>
                    <div id="url">
                        <a href="http://www.jd.com" title="jd">jd</a>
                        <a href="http://www.360buy.com" title="360buy">360buy</a>
                    </div>
                </div>
            </body>
        </html>
    """
    selector = etree.HTML(html)
    
    # ########### example 1 ############
    # 这里使用id属性来定位哪个div和ul被匹配 使用text()获取文本内容
    # 这里注意要层层匹配
    # content = selector.xpath('//div[@id="cctv"]/div[@class="content"]/ul[@id="ul"]/li/text()')
    # content = selector.xpath('//div[@id="cctv"]/div[@class="content"]/ul[@id="ul2"]/li/span[@class="ctv"]/text()')
    content = selector.xpath('//a/@href')
    
    for i in content:
        print(i)
    print(u"************ 华丽分割符1 ************")
    
    # ########### example 2 ############
    # 使用绝对路径定位a标签的title
    con = selector.xpath('/html/body/div/a/@title')
    # 使用相对路径定位 两者效果是一样的
    con = selector.xpath('//a/@title')
    print(len(con))
    print(con[0], con[1])
    print(u"************ 华丽分割符2 ************")
    
    # ########### example 3 ############
    # starts-with 解决标签属性值以相同字符串开头的情况
    con2 = selector.xpath('//span[starts-with(@class,"c")]/text()')  # 这里使用starts-with方法提取div的id标签属性值开头为a的div标签
    for i in con2:
        print(i)
    print(u"************ 华丽分割符3 ************")
    
    # string(.) 标签套标签
    html2 = '''
       <div id="a">
           left
            <span id="b">
               right
                <ul>
                   up
                    <li>down</li>
                </ul>
               east
            </span>
            west
        </div>
    '''
    
    # 下面是没有用string方法的输出
    selector2 = etree.HTML(html2)
    con3 = selector2.xpath('//div[@id="a"]/text()')
    for i in con3:
        print(i)
    print(u"************ 华丽分割符4 ************")
    
    # 下面使用string方法的输出
    data = selector2.xpath('//div[@id="a"]')
    # info = data[0].xpath('string(.)').extract()[0]
    info = data[0].xpath('string(.)')
    con4 = info.replace('
    ', '').replace(' ', '')
    for i in con4:
        # python 输出结果默认是
    ,换行,将结尾替换掉即可实现不换行。
        print(i, end='')
    print("
    ")
    print(u"************ 华丽分割符5 ************")
    
    # ########### example 4 ############
    html3 = """
        <div>hello
            <p>H</p>
        </div>
        <div>hehe</div>
    """
    selector3 = etree.HTML(html3)
    # 使用text()的方法来判别是哪个div标签
    con5 = selector3.xpath('//div[text()="hehe"]/text()')
    print(con5[0])
    print(u"************ 华丽分割符6 ************")
    
    # ########### example 5 ############
    html4 = """
        <div id="utv">hello
            <p>H</p>
            <p>J</p>
            <p>I</p>
        </div>
        <div>hehe</div>
    """
    selector4 = etree.HTML(html4)
    # 在XPath中可以使用多重过滤方法寻找标签,例如ul[3][@id=”a”] 这里使用【3】来寻找第三个ul标签 并且它的id属性值为a
    con6 = selector4.xpath('//div/p[position()>=2]/text()')
    for i in con6:
        print(i)
    print(u"************ 华丽分割符7 ************")
  • 相关阅读:
    Linux 安装多版本Python
    ElasticSearch 镜像 & 安装 & 简易集群
    SpringBoot-异步调用@Async
    SprinigBoot整合Kafka
    Kafka快速安装部署
    Linux-JDK安装
    npm / yarn 配置镜像、使用方法
    React搭建项目(全家桶)
    原生JS 将canvas生成图片
    原生 JS 的 Base64 转码
  • 原文地址:https://www.cnblogs.com/hunttown/p/6703791.html
Copyright © 2011-2022 走看看