用xpath解析网页
作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591
lxml手册:http://lxml.de/index.html
1.下面的例子源自于博客 用lxml解析HTML¶
from lxml import etree
待解析的文本
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一遇到 “/”就会认为其标签结束。
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过程中出现的几个对象的类型
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等等。
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
或者
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.
hrefs = page.xpath(u"//a[3]")#此序号从1开始 print hrefs[0].attrib
{'href': 'http://www.4399.com/flash/35538.htm', 'target': '_blank'}
星号 * 可以代替所有的节点名
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 使用实例¶
import lxml.html
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> '''
doc = lxml.html.document_fromstring(html)
print "总共有%d本书" %(len(doc.xpath('/html/body/bookstore/book')))
总共有4本书
print "2005 年出版的书有%d本"% (len(doc.xpath('/html/body/bookstore/book[year=2005]')))
2005 年出版的书有2本
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
price = doc.xpath("//bookstore/book[title='Harry Potter']/price") print(price[0].text)
29.99
3.分析在线网页¶
r = requests.get('https://www.python.org')
doc = lxml.html.document_fromstring(r.content)
ps = doc.xpath('/html/body/div/div/nav/ul/li/a')
for p in ps:print p.text
Python PSF Docs PyPI Jobs Community
4.博客园粉丝关系解析¶
用xpath解析网页相关推荐
- python通过xpath解析网页爬取高清大图和王者荣耀英雄海报
python通过xpath解析网页 xpath XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但 ...
- 【Golang实战】——XPath解析网页
引言 之前用Python写过一个解析网页的脚本,最近开始研究golang,所以准备用golang将其重构,但是这个脚本中使用了到了python中的xpath库,所以研究了下,golang也有对应的库, ...
- 使用xpath解析网页的实例(完整代码)
本文以解析搜狗网页为例,使用xpath方法解析出来它的十个搜锁热词,代码简洁通俗易懂,非常适合初学者入门.完整代码如下: #导入相关库 import requests from lxml import ...
- 6、通过xpath获取网页数据
1.xpath解析网页源文件 from urllib import request from lxml import etree # 请求的url url = "http://www.dfe ...
- Python3使用Xpath解析网易云音乐歌手页面
Xpath最初被设计用来搜寻XML文档,但它同样适用于HTML文档的搜索.通过简洁明了的路径选择表达式,它提供了强大的选择功能:同时得益于其内置的丰富的函数,它可以匹配和处理字符串.数值.时间等数据格 ...
- python爬取微博评论(通过xpath解析的方式)
前段时间笔者写了一份儿爬取微博评论的代码,是用了http://m.weibo.cn的接口,通过这个接口比较好的是代码比较好写,因为数据都是json格式的,规律性非常直观,属性json数据和字典操作的朋 ...
- Python爬虫(入门+进阶)学习笔记 1-4 使用Xpath解析豆瓣短评
本节课程主要介绍解析神器Xpath是什么.Xpath如何安装及使用,以及使用实际的例子讲解Xpath如何解析豆瓣短评的网页并获取数据. 解析神器Xpath Xpath的使用 实战环节 解析神器Xpat ...
- 用Xpath选择器解析网页(lxml)
在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...
- scrapy无法使用xpath解析?特殊网页的信息提取(1) — 百度贴吧
scrapy无法使用xpath解析?特殊网页的信息提取(1) - 百度贴吧 1. 背景 最近在使用scrapy爬取百度贴吧帖子内容时,发现用xpath无法解析到页面元素.但是利用xpath helpe ...
最新文章
- 依赖倒置(DIP),控制反转(IoC)与依赖注入(DI)
- nginx.redis.mysql_nginx,redis_mysql和redis效率问题,nginx,redis,mysql,php - phpStudy
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车黑线循迹、避障、遥控实验综合程序
- 「译」JUnit 5 系列:环境搭建
- 解决微信小程序开发中wxss中不能用本地图片
- Centos下telnet的安装和配置
- python 类变量和实例变量
- 响应式开发---网页的布局方式、媒体查询、栅格化布局、less语言
- 读Zepto源码之Callbacks模块
- 利用JDBC工具类 模拟用户登录!
- 经营管理者杂志经营管理者杂志社经营管理者编辑部2022年第7期目录
- android投屏到web,安卓投屏神器下载|安卓投屏神器(Web Video Caster)v4.5.4高级版下载 - 99安卓游戏...
- python使用win32*模块模拟人工操作——城通网盘下载器(一)
- ES6转化ES5方法(处理低版本手机白屏等兼容问题)
- 请将磁盘插入“U盘(F)“
- Spring Cloud 如何统一异常处理?写得太好了!
- Java 8 Update 201 (8u201)
- riscv 的 CSR
- 蓝桥杯 ALGO-121 算法训练 猴子分苹果
- nextInt与nextLine
热门文章
- 如何搭建合理的BOM
- 使用yum安装java
- 【火炉炼AI】机器学习008-简单线性分类器解决二分类问题
- 11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装
- 使用OpenCV和Python进行人脸识别
- 方舟服务器建家位置,《方舟生存进化》五种建家位置!每一种都能暴露建造者的种类!...
- Bootstrap+web+Idea实现登录页面(含验证码)
- poker游戏编码规则
- 【微电网优化】基于粒子群算法求解热电联供型微电网经济运行优化问题含Matlab源码
- 仿支付宝头像外加一个边框的工具类