文章转自:http://blog.csdn.net/skyeyesxy/article/details/50838003
概要:
- XPath的介绍与配置
- XPath的使用
- XPath的特殊用法
- Python并行化
- 官方名称:XML路径语言(XMLpathlanguage)
- 用来确定xml文档中某部分位置的语言(查找信息)
- XPath支持HTML
- XPath通过元素和属性进行导航
- 需要安装lxml库
- from lxml import etree
- Selector = etree.HTML(网页源代码)
(将网页源代码转换成XPath能够识别的格式)
(Selector为变量名)- Selector.xpath(…)
- XPath与HTML结构
- 获取网页元素的Xpath
- 应用XPath提取内容
树状结构->逐层展开->逐层定位->寻找独立节点
- 手动分析法
- Chrome生成法
直接右键copy Xpath
//*[@id="useful"]/li[1]
- 星号代表只有一个id为useful,若有别的id相同,则必须写明标签
- li[1]说明为第一个
//
在这里是默认的(根目录)
语法分析:
//
定位根节点/
往下层寻找- 提取文本内容: /text()
- 提取属性内容: /@xxxx
“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]
输出:
- 极客学院课程库
- 以相同的字符开头
- 标签套标签
- starts-with(@属性名称,属性字符相同部分)
eg.
<div id="test-1">需要的内容1div>
<div id="test-2">需要的内容2div>
<div id="testfault">需要的内容3div>
- string(.)
eg.
<div id="class3">美女,
<font color=red>你的微信是多少?font>
div>
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
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>
输出:
#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号', '附近高薪工作查看地图']