首页 > 代码库 > 利用python脚本(xpath)抓取数据

利用python脚本(xpath)抓取数据

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

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

# -*- coding:utf-8 -*-from lxml import etreehtml = """    <!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标签的titlecon = 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 = http://www.mamicode.com/selector2.xpath(//div[@id="a"])# info = data[0].xpath(‘string(.)‘).extract()[0]info = data[0].xpath(string(.))con4 = info.replace(\n, ‘‘).replace( , ‘‘)for i in con4:    # python 输出结果默认是\n,换行,将结尾替换掉即可实现不换行。    print(i, end=‘‘)print("\r")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属性值为acon6 = selector4.xpath(//div/p[position()>=2]/text())for i in con6:    print(i)print(u"************ 华丽分割符7 ************")

 

利用python脚本(xpath)抓取数据