lxml解析html时,检验XPath

来源:互联网 发布:阿里云的图标 编辑:程序博客网 时间:2024/06/06 04:14

这两天在研究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 etreef = 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/

#提取titletitle = 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 etreetext="""    <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

0 0
原创粉丝点击