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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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(\\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属性值为a
con6 = selector4.xpath(//div/p[position()>=2]/text())
for i in con6:
    print(i)
print(u"************ 华丽分割符7 ************")

 

以上是关于利用python脚本(xpath)抓取数据的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想(149):使用Scrapy抓取数据,并通过XPath指定解析规则

Python爬虫编程思想(149):使用Scrapy抓取数据,并通过XPath指定解析规则

使用lxml的Python脚本,xpath返回空列表

请教网页里的特定数据怎么抓取?

如何使用 python 为 Web 元素生成 Xpath(在我的脚本中运行时)?

Amazon关键词抓取