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]说明为第一个
  • //在这里是默认的(根目录)

语法分析:

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

b.eg.

“text.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>不需要的信息1li>
        <li>不需要的信息2li>
        <li>不需要的信息3li>
    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

输出:

  • http://jikexueyuan.com 
    http://jikexueyuan.com/sourse/

c.提取title

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

输出:

  • 极客学院课程库

3.XPath的特殊用法

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

1)以相同的字符开头

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

eg.

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

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


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
    <div id="test-1">需要的内容1div>
    <div id="test-2">需要的内容2div>
    <div id="testfault">需要的内容3div>
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


<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>

输出:


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

XPath学习笔记---2(特殊用法)_第1张图片

#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号', '附近高薪工作查看地图']


你可能感兴趣的:(python爬虫,XPath)