您的位置:首页 > Web前端 > HTML

lxml解析html时,检验XPath

2017-02-05 20:29 489 查看
这两天在研究Scrapy,在遇到用Xpath提出时,需要有Chrome的XPath helper,但老是出现错误。废话少说,还是先把测试网页保存到本地,逐步的测试提取。

测试文本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>

<div id="test-0">大家好!</div>
<div id="test-1">需要的内容1</div>
<div id="test-2">需要的内容2</div>
<div id="testfault">需要的内容3</div>

<div id="tiger">
我左青龙,
<span id="tiger2">
右白虎,
<ul>
上朱雀,
<li>下玄武。</li>
</ul>
老牛在当中,
</span>
龙头在胸口。
</div>

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

</body>
</html>


使用XPath对相关内容的提取

# -*- coding: utf-8 -*-
from lxml import etree
f = open('text.html', 'r',encoding="utf-8")
html = f.read()
#print (html)
f.close()

selector = etree.HTML(html)


selector.xpath提取后为list

#提取单个文本
content = selector.xpath('//div[@id="test-0"]/text()')
print (content)


[‘大家好!’]

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


结果为:

这是第一条信息

这是第二条信息

这是第三条信息

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


结果为:

http://jikexueyuan.com

http://jikexueyuan.com/sourse/

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


结果为:

极客学院课程库

# 以相同的字符开头 starts-with(@属性名称,属性字符相同部分)
content = selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:
print (each)


结果为:

大家好!

需要的内容1

需要的内容2

需要的内容3

美女,

#标签套标签,取出所有的标签
data = selector.xpath('//div[@id="test-3"]')[0]
info = data.xpath('string(.)')
info=str(info)# info为<class 'lxml.etree._ElementUnicodeResult'>,转为字符
content=" ".join(info.split())
print (content)

data = selector.xpath('//div[@id="tiger"]')[0]
info = data.xpath('string(.)')
info=str(info)# info为<class 'lxml.etree._ElementUnicodeResult'>,转为字符
content=" ".join(info.split())
print (content)


结果为:

美女, 你的微信是多少?

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

注:这里我将list转为str。网上有许多其他方法加extract()我尝试后,发现均出错。

另外,发现网上的代码有问题。

data = selector.xpath('//div[@id="test3"]')info = data.xpath('string(.)').extract()[0]
这样,就可以把“我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口”整个句子提取出来,赋值给info变量。


在IDE中直接测试

from lxml import etree
text="""
<div class="bd doulist-subject">
<div class="source">
来自:豆瓣读书
</div>

<div class="post">
<a href="https://book.douban.com/subject/10519369/" target="_blank">
<img width="100" src="https://img1.doubanio.com/lpic/s8869768.jpg">
</a>
</div>

<div class="title">
<a href="https://book.douban.com/subject/10519369/" target="_blank">
万物生光辉
</a>
</div>

<div class="rating">
<span class="allstar50"></span>
<span class="rating_nums">9.4</span>
<span>(738人评价)</span>
</div>

<div class="abstract">
"
作者: [英] 吉米·哈利
<br>
"
出版社: 中国城市出版社
<br>
"
出版年: 2012-3
"
</div>
</div>

"""

selector = etree.HTML(text)

title = selector.xpath('//div[@class="title"]/a/text()')
title=title[0]
title=title.replace(" ","").replace("\\n","").replace("\\r","")
title=title.strip()
print (title)

rate = selector.xpath('//span[@class="rating_nums"]/text()')
rate=rate[0]
rate=rate.replace(" ","").replace("\\n","").replace("\\r","")
print (rate)

author = selector.xpath('//div[@class="abstract"]/text()')
author=author[0]
author=author.replace(" ","").replace("\\n","").replace("\\r","").replace('"',"")
author=author.strip()
print (author)


参考如下网页,非常感谢:

http://blog.csdn.net/betabin/article/details/24392369

http://blog.csdn.net/skyeyesxy/article/details/50838003

http://blog.chinaunix.net/uid-13869856-id-5747417.html

https://segmentfault.com/q/1010000006053119/a-1020000006053611
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python xpath html