作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591

lxml手册:http://lxml.de/index.html

1.下面的例子源自于博客 用lxml解析HTML¶

In [1]:
from lxml import etree

待解析的文本

In [4]:
html = '''<html>
  <head>
    <meta name="content-type" content="text/html; charset=utf-8" />
    <title>友情链接查询 - 站长工具</title>
    <!-- uRj0Ak8VLEPhjWhg3m9z4EjXJwc -->
    <meta name="Keywords" content="友情链接查询" />
    <meta name="Description" content="友情链接查询" />  </head>
  <body>
    <h1 class="heading">Top News</h1>
    <p style="font-size: 200%">World News only on this page</p>
    Ah, and here's some more text, by the way.
    <p>... and this is a parsed fragment ...</p>    <a href="http://www.cydf.org.cn/" rel="nofollow" target="_blank">青少年发展基金会</a>
    <a href="http://www.4399.com/flash/32979.htm" target="_blank">洛克王国</a>
    <a href="http://www.4399.com/flash/35538.htm" target="_blank">奥拉星</a>
    <a href="http://game.3533.com/game/" target="_blank">手机游戏</a>
    <a href="http://game.3533.com/tupian/" target="_blank">手机壁纸</a>
    <a href="http://www.4399.com/" target="_blank">4399小游戏</a>
    <a href="http://www.91wan.com/" target="_blank">91wan游戏</a>  </body>
</html>'''

使用lxml前注意事项:先确保html经过了utf-8解码,即code = html.decode(‘utf-8’, ‘ignore’),否则会出现解析出错情况。因为中文被编码成utf-8之后变成 ‘/u2541’ 之类的形式,lxml一遇到 “/”就会认为其标签结束。

In [47]:
page = etree.HTML(html.decode('utf-8'))
hrefs = page.xpath(u"//a")#它会找到整个html文本里的所有 a 标签
for href in hrefs:print href.attrib['href']#+"  "+href.text
for href in hrefs:print href.text

http://www.cydf.org.cn/
http://www.4399.com/flash/32979.htm
http://www.4399.com/flash/35538.htm
http://game.3533.com/game/
http://game.3533.com/tupian/
http://www.4399.com/
http://www.91wan.com/
青少年发展基金会
洛克王国
奥拉星
手机游戏
手机壁纸
4399小游戏
91wan游戏

上面解析HTML过程中出现的几个对象的类型

In [30]:
print type(hrefs)
print type(href)
print type(href.text)
print type(href.attrib)

<type 'list'>
<type 'lxml.etree._Element'>
<type 'unicode'>
<type 'lxml.etree._Attrib'>

过滤的方法就是用[”@”]把过滤条件加上。类似的还有@name, @id, @value, @href, @src, @class等等。

In [48]:
p = page.xpath(u"/html/body/p[@style='font-size: 200%']")
#用“/”来作为上下层级间的分隔。第一个“/”表示文档的根节点。
print p[0].values()
print p[0].text

['font-size: 200%']
World News only on this page

或者

In [49]:
p = page.xpath(u"//p[@style='font-size: 200%']")
print p[0].values()
print p[0].text

['font-size: 200%']
World News only on this page

数字定位功能,需要注意的是序号从1开始,而不是0.

In [53]:
hrefs = page.xpath(u"//a[3]")#此序号从1开始
print hrefs[0].attrib

{'href': 'http://www.4399.com/flash/35538.htm', 'target': '_blank'}

星号 * 可以代替所有的节点名

In [56]:
metas = page.xpath(u"/html/*/meta")
for meta in metas:print meta.attrib
for meta in metas:print meta.attrib['name']

{'content': 'text/html; charset=utf-8', 'name': 'content-type'}
{'content': u'\u53cb\u60c5\u94fe\u63a5\u67e5\u8be2', 'name': 'Keywords'}
{'content': u'\u53cb\u60c5\u94fe\u63a5\u67e5\u8be2', 'name': 'Description'}
content-type
Keywords
Description

2.下面的例子源自于博客 python lxml xpath 使用实例¶

In [57]:
import lxml.html

In [59]:
html='''
<html>
<body>
<bookstore position="cn">
    <book category="A">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
    <book category="B">
        <title lang="en">Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
</bookstore>
<bookstore position="pk">
    <book category="A">
        <title lang="en">Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>
<bookstore position="jp">
    <book category="C">
        <title lang="en">XQuery Kick Start</title>
        <author>James McGovern</author>
        <author>Per Bothner</author>
        <author>Kurt Cagle</author>
        <author>James Linn</author>
        <author>Vaidyanathan Nagarajan</author>
        <year>2003</year>
        <price>49.99</price>
    </book>
</bookstore>
</body>
</html>
'''

In [61]:
doc = lxml.html.document_fromstring(html)

In [62]:
print "总共有%d本书" %(len(doc.xpath('/html/body/bookstore/book')))

总共有4本书

In [63]:
print "2005 年出版的书有%d本"% (len(doc.xpath('/html/body/bookstore/book[year=2005]')))

2005 年出版的书有2本

In [66]:
print "2005 年出版的书在 %s" % (" ".join([ i.get("position")  for i in doc.xpath('/html/body/bookstore/book[year=2003]/parent::*') ]))
# get("position")biaosh表示获得position属性。
# parent::表示任意父节点

2005 年出版的书在 pk jp

In [67]:
price = doc.xpath("//bookstore/book[title='Harry Potter']/price")
print(price[0].text)

29.99

3.分析在线网页¶

In [71]:
r = requests.get('https://www.python.org')

In [78]:
doc = lxml.html.document_fromstring(r.content)

In [83]:
ps = doc.xpath('/html/body/div/div/nav/ul/li/a')

In [85]:
for p in ps:print p.text

Python
PSF
Docs
PyPI
Jobs
Community

4.博客园粉丝关系解析¶

In [ ]:

用xpath解析网页相关推荐

  1. python通过xpath解析网页爬取高清大图和王者荣耀英雄海报

    python通过xpath解析网页 xpath XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但 ...

  2. 【Golang实战】——XPath解析网页

    引言 之前用Python写过一个解析网页的脚本,最近开始研究golang,所以准备用golang将其重构,但是这个脚本中使用了到了python中的xpath库,所以研究了下,golang也有对应的库, ...

  3. 使用xpath解析网页的实例(完整代码)

    本文以解析搜狗网页为例,使用xpath方法解析出来它的十个搜锁热词,代码简洁通俗易懂,非常适合初学者入门.完整代码如下: #导入相关库 import requests from lxml import ...

  4. 6、通过xpath获取网页数据

    1.xpath解析网页源文件 from urllib import request from lxml import etree # 请求的url url = "http://www.dfe ...

  5. Python3使用Xpath解析网易云音乐歌手页面

    Xpath最初被设计用来搜寻XML文档,但它同样适用于HTML文档的搜索.通过简洁明了的路径选择表达式,它提供了强大的选择功能:同时得益于其内置的丰富的函数,它可以匹配和处理字符串.数值.时间等数据格 ...

  6. python爬取微博评论(通过xpath解析的方式)

    前段时间笔者写了一份儿爬取微博评论的代码,是用了http://m.weibo.cn的接口,通过这个接口比较好的是代码比较好写,因为数据都是json格式的,规律性非常直观,属性json数据和字典操作的朋 ...

  7. Python爬虫(入门+进阶)学习笔记 1-4 使用Xpath解析豆瓣短评

    本节课程主要介绍解析神器Xpath是什么.Xpath如何安装及使用,以及使用实际的例子讲解Xpath如何解析豆瓣短评的网页并获取数据. 解析神器Xpath Xpath的使用 实战环节 解析神器Xpat ...

  8. 用Xpath选择器解析网页(lxml)

    在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...

  9. scrapy无法使用xpath解析?特殊网页的信息提取(1) — 百度贴吧

    scrapy无法使用xpath解析?特殊网页的信息提取(1) - 百度贴吧 1. 背景 最近在使用scrapy爬取百度贴吧帖子内容时,发现用xpath无法解析到页面元素.但是利用xpath helpe ...

最新文章

  1. 依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)
  2. nginx.redis.mysql_nginx,redis_mysql和redis效率问题,nginx,redis,mysql,php - phpStudy
  3. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车黑线循迹、避障、遥控实验综合程序
  4. 「译」JUnit 5 系列:环境搭建
  5. 解决微信小程序开发中wxss中不能用本地图片
  6. Centos下telnet的安装和配置
  7. python 类变量和实例变量
  8. 响应式开发---网页的布局方式、媒体查询、栅格化布局、less语言
  9. 读Zepto源码之Callbacks模块
  10. 利用JDBC工具类 模拟用户登录!
  11. 经营管理者杂志经营管理者杂志社经营管理者编辑部2022年第7期目录
  12. android投屏到web,安卓投屏神器下载|安卓投屏神器(Web Video Caster)v4.5.4高级版下载 - 99安卓游戏...
  13. python使用win32*模块模拟人工操作——城通网盘下载器(一)
  14. ES6转化ES5方法(处理低版本手机白屏等兼容问题)
  15. 请将磁盘插入“U盘(F)“
  16. Spring Cloud 如何统一异常处理?写得太好了!
  17. Java 8 Update 201 (8u201)
  18. riscv 的 CSR
  19. 蓝桥杯 ALGO-121 算法训练 猴子分苹果
  20. nextInt与nextLine

热门文章

  1. 如何搭建合理的BOM
  2. 使用yum安装java
  3. 【火炉炼AI】机器学习008-简单线性分类器解决二分类问题
  4. 11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装
  5. 使用OpenCV和Python进行人脸识别
  6. 方舟服务器建家位置,《方舟生存进化》五种建家位置!每一种都能暴露建造者的种类!...
  7. Bootstrap+web+Idea实现登录页面(含验证码)
  8. poker游戏编码规则
  9. 【微电网优化】基于粒子群算法求解热电联供型微电网经济运行优化问题含Matlab源码
  10. 仿支付宝头像外加一个边框的工具类