XPath学习笔记---2(特殊用法)

文章转自:http://blog.csdn.net/skyeyesxy/article/details/50838003

概要:

  • XPath的介绍与配置
  • XPath的使用
  • XPath的特殊用法
  • Python并行化

1.XPath的介绍与配置

  • 官方名称:XML路径语言(XMLpathlanguage)
  • 用来确定xml文档中某部分位置的语言(查找信息)
  • XPath支持HTML
  • XPath通过元素和属性进行导航
  • [x] 提取信息
  • [x] 比正则表达式高级
  • [x] 比正则表达式简单

1)如何安装使用XPath

  • 需要安装lxml库
  • from lxml import etree
  • Selector = etree.HTML(网页源代码) 
    (将网页源代码转换成XPath能够识别的格式) 
    (Selector为变量名)
  • Selector.xpath(…)

2.XPath的使用

  • XPath与HTML结构
  • 获取网页元素的Xpath
  • 应用XPath提取内容

1)XPath与HTML结构

树状结构->逐层展开->逐层定位->寻找独立节点

2)获取网页元素的Xpath

  • 手动分析法
  • Chrome生成法 
    直接右键copy Xpath

a.语法

//*[@id="useful"]/li[1]

  • 星号代表只有一个id为useful若有别的id相同,则必须写明标签
  • li[1]说明为第一个<li>
  • //在这里是默认的<html><body>(根目录)

语法分析:

  • //定位根节点
  • /往下层寻找
  • 提取文本内容: /text()
  • 提取属性内容: /@xxxx

b.eg.

“text.html”

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试-常规方法</title>
</head>
<body>
<div id="content">
    <ul id="useful">
        <li>这是第一条信息</li>
        <li>这是第二条信息</li>
        <li>这是第三条信息</li>
    </ul>
    <ul id="useless">
        <li>不需要的信息1</li>
        <li>不需要的信息2</li>
        <li>不需要的信息3</li>
    </ul>

    <div id="url">
        <a href="http://jikexueyuan.com">极客学院</a>
        <a href="http://jikexueyuan.com/sourse/" title="极客学院课程库">点我打开课程库</a>
    </div>
</div>
</body>
</html>

“xpath_regular.py”

# -*- coding: utf-8 -*-
from lxml import etree
f = open('text.html', 'r')
html = f.read()
f.close()
#可以直接使用下面的selector,不用上面的read
selector = etree.HTML(html)

a.提取文本

#提取文本
content = selector.xpath('//ul[@id="useful"]/li/text()')
for each in content:
    print each

输出:

  • 这是第一条信息 
    这是第二条信息 
    这是第三条信息

b.提取属性

#提取属性
link = selector.xpath('//a/@href')
for each in link:
    print each

输出:

c.提取title

title = selector.xpath('//a/@title')
print title[0]

输出:

  • 极客学院课程库

3.XPath的特殊用法

  • 以相同的字符开头
  • 标签套标签

1)以相同的字符开头

  • starts-with(@属性名称,属性字符相同部分)

eg.

<div id="test-1">需要的内容1</div>
<div id="test-2">需要的内容2</div>
<div id="testfault">需要的内容3</div>

2)标签套标签

  • string(.)

eg.

<div id="class3">美女,
    <font color=red>你的微信是多少?</font>
</div>

3)演示

a.starts-with:

xpath_special.py

# -*- coding: utf-8 -*-
from lxml import etree
f = open('special.html', 'r')
html = f.read()
f.close()
selector = etree.HTML(html)
content = selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:
    print each

special.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div id="test-1">需要的内容1</div>
    <div id="test-2">需要的内容2</div>
    <div id="testfault">需要的内容3</div>
</body>
</html>

输出:

  • 需要的内容1
  • 需要的内容2
  • 需要的内容3
b.string(.):

xpath_special.py

# -*- coding: utf-8 -*-
from lxml import etree
f = open('special2.html', 'r')
html = f.read()
f.close()
selector = etree.HTML(html)
data = selector.xpath('//div[@id="test3"]')[0]
info = data.xpath('string(.)')
content = info.replace('\n', '').replace(' ','')
print content

special2.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div id="test3">
        我左青龙,
        <span id="tiger">
            右白虎,
            <ul>
                上朱雀,
                <li>下玄武。</li>
            </ul>
            老牛在当中,
        </span>
        龙头在胸口。
    </div>
</body>
</html>

输出:


  • 我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口。


#span/text():这个只能提取span标签下面的文字,如果span下面还有标签,这个不能得到下面标签的文字
info=info_selector.xpath('/html/body/div[4]/div[2]/div[2]/div[1]/div[1]/ul/li/span/text()')

输出结果:
['租赁方式:', '合租 - 次卧 - 男女不限', '房屋类型:', '3室1厅1卫                                \xa0\xa014                                平\xa0\xa0精装修 ', '朝向楼层:', '南北\xa0\xa0中层/共33层', '所在小区:', '所属区域:', '\r\n                                                                    ', '\xa0\xa0\r\n                                                                                                    ', '\r\n                                                            ', '详细地址:', '\r\n                                工农兵路125号                            ', '\r\n                            ', '\xa0\xa0\r\n                                                                    ', '\r\n                                                            ']

#先得到span标签,再用标签套标签的string(.)来获取每个标签的文字,其中每一个span下的文字都形成结果list的一个单独的
info_1=info_selector.xpath('/html/body/div[4]/div[2]/div[2]/div[1]/div[1]/ul/li/span')
info_li=[]
for i in info_1:
    fi=i.xpath('string(.)')
    info_li.append(fi.replace('\xa0\xa0','').replace(' ','').replace('\r\n',''))
输出结果:
['租赁方式:', '合租-次卧-男女不限', '房屋类型:', '3室1厅1卫14平精装修', '朝向楼层:', '南北中层/共33层', '所在小区:', '翰林紫园', '所属区域:', '江岸二七路', '详细地址:', '工农兵路125号', '附近高薪工作查看地图']


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值