Lxml 解析网页用法笔记

标签: lxml python
13人阅读 评论(0) 收藏 举报
分类:

用python的urllib2库实现的获取到网页数据之后,使用lxml对获取的网页进行数据抓取。

1.导入包 from lxml import etree

2.page = etree.HTML(html) 或者 page = etree.HTML(html.decode('utf-8'))

3.对Element对象(page)使用xpath筛选,返回一个列表(里面的元素也是Element)

举例:

<html>
  <head>
    <meta name="content-type" content="text/html; charset=utf-8" />
    <title>示例</title>    
  </head>
  <body>
    <h1 class="cl1">测试内容一</h1>
    <p style="font-size: 200%">测试内容二</p>
    测试内容三
    <p>测试内容四</p>
    <a href="http://www.baidu.com/"  target="_blank">百度</a> 
    <a href="http://www.google.com" target="_blank">谷歌</a>
    <a href="http://www.ali.com" target="_blank">阿里</a> 
    <a href="http://game.tencent.com" target="_blank"><img src='www.baidu.com'/>腾讯</a>
    <a href="http://game.sina.com" target="_blank"><img src='www.baidu.com'/>新浪</a>
    <a href="http://www.huawei.com" target="_blank"><img src='www.baidu.com'/>华为</a> 
    <a href="http://www.xiaomi.com" target="_blank"><img src='www.baidu.com'/>小米</a>

  </body>
</html>

解析html

from lxml import etree
page = etree.HTML(html.decode('utf-8'))

获取标签

# a标签
tags = page.xpath(u'/html/body/a')
print(tags)  
# html 下的 body 下的所有 a
# 结果[<Element a at 0x34b1f08>, ...]

/html  整个网页的根目录

/html/body/a  获取整个网页<body>标签下所有<a>标签

//a  获取html下所有a标签,在本例中功能同上(所有a标签都放在body下,别的地方没有)

/descendant::a  等价于 //a   descendant::前缀可纸袋任意多层中间节点,也可以省略成一个“ /”

/html/body/*/a  表示取出body下第二级的所有a标签,不管它的上级是什么标签,‘*’可以代表所有的节点名

获取head里面的标签要特别一点 比如//html/head/*  或者//html/head/title

获取节点(标签)属性:

for taga in tags:
    print(taga.attrib)    
    # 获取属性: {'target': '_blank', 'href': 'http://www.ali.com'}
    print(taga.get('href'))
    # 获取某一属性:http://www.ali.com
    print(taga.text)
    # 获取文本: 阿里

利用属性筛选标签

# 直接定位到<h1 class="cl1">测试内容一</h1>
hs = page.xpath("//h1[@class='heading']")
for h in hs:
    print(h.values())
    print(h.text)
    # 打印结果:
    # ['heading']
    # 测试内容一

属性可以写@name,@id,@value,@src,@href...

如果没有属性,也可以使用text()(表示标签内包含的内容)和positon()(获取节点的位置)

示例:

a[position()=2] 表示取得第二个a节点,可以被省略为a[2]

需要注意数字定位和过滤条件的顺序

/body/a[5][@name='hello'] 表示取下第五个a标签,并且name必须是hello,否则为空

/body/a[@name='hello'][5] 表示取body下第五个name为hello的a标签

preceding-sibling::和 following-sibling::

preceding-sibling::前缀表示同一层的上一个节点

following-sibling::前缀表示同一层的下一个节点

示例

//body//following-sibling::a  同层下一个a标签
//body/h1/preceding-sibling::*  所有h1上所有h1同级的子标签

tail获取特殊内容

<a href="http://game.tencent.com" target="_blank"><img src='www.baidu.com'/>腾讯</a>

‘腾讯’两个字在<img/>和</a>标签中间,正常使用text是获取不到内容的,需要使用taga.tail.strip()来获取内容

   tail的意思是结束节点前面的内容,就是<img/>和</a>标签中间的内容


如果script与style标签之间的内容影响解析页面,或者页面很不规则,可以使用lxml.html.clean模块。模块 lxml.html.clean 提供 一个Cleaner 类来清理 HTML 页。它支持删除嵌入或脚本内容、 特殊标记、 CSS 样式注释或者更多。

  cleaner = Cleaner(style=True, scripts=True,page_structure=False, safe_attrs_only=False)
  print cleaner.clean_html(html)


  注意,page_structure,safe_attrs_only为False时保证页面的完整性,否则,这个Cleaner会把你的html结构与标签里的属性都给清理了。使用Cleaner类要十分小心,小心擦枪走火。
  忽略大小写可以:

page = etree.HTML(html)
  keyword_tag = page.xpath("//meta[translate(@name,'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')='keywords']")




查看评论

计算机基础win7的基本用法

掌握计算机的基本操作,掌握win7的基本用法,达到自己计算机的平常维护,学会办公软件的用法,为继续学习IT技术打好基础。 win7基本用法和优化、备份,办公软件用法,多媒体用法
  • 2018年01月17日 11:15

Python:用lxml解析HTML

先演示一段获取页面链接代码示例: #coding=utf-8 from lxml import etree html = '''             友情链接查询 ...
  • BetaBin
  • BetaBin
  • 2014-04-24 09:27:39
  • 49669

Python 爬虫 —— 网页内容解析(lxml)

1. lxmlfrom lxml import etree etree 下的 HTML 对象,其构造函数接受 requests.request 的返回值对象:url = ... user_agent ...
  • lanchunhui
  • lanchunhui
  • 2018-01-03 21:28:49
  • 100

Python中尝试用lxml去解析html

【记录】Python中尝试用lxml去解析html 【背景】 Python中,之前一直用BeautifulSoup去解析html的: 【教程】Python中第三方的用于解析HTML的库:Be...
  • zhengalen
  • zhengalen
  • 2016-05-16 09:10:49
  • 7008

python lxml库etree解析html

在用python爬取数据时重要的一个环节就是从获得的html页面中分析提取出所需要的数据。 一个常用的方法是使用正则表达式,进行匹配提取,这是一种通用的字符串匹配分析方式。但对于html页面来说并没有...
  • brink_compiling
  • brink_compiling
  • 2016-07-18 13:18:22
  • 2345

python(2.7.13)爬虫爬取天堂网图片

  • 2017年08月16日 21:15
  • 2KB
  • 下载

使用lxml解析HTML数据

HTML数据解析 诸如爬虫类场景下我们需要对抓取的HTML做内容解析,提取感兴趣的内容,python标准库提供了HTMLParser\SGMLParser两个模块用于解析HTML,然而这两个模块的实...
  • willyan2002
  • willyan2002
  • 2017-07-05 10:46:50
  • 534

Python+lxml解析html

代码中有注释: import lxml.etree import sys html = '''             友情链接查询 - 站长工具                        ...
  • zhihaoma
  • zhihaoma
  • 2016-07-14 14:37:31
  • 7937

Python网页抓取之Lxml

Lxml是基于libxml2这一XML解析库的Python封装。该模块使用C语言编写,解析速度比BeautifulSoup更快。 Lxml可以正确解析属性两侧缺失的引号,并闭合标签。如案例一 案例...
  • yy763496668
  • yy763496668
  • 2017-05-09 10:48:18
  • 333

python 利用lxml 解析xml文件

python 利用lxml 解析xml文件 运行下面程序之前首先保证你的运行环境已经支持python和lxml 如没有安装lxml 文件请参考:http://blog.csdn.net/zhaok...
  • zhaokuo719
  • zhaokuo719
  • 2012-11-26 14:57:04
  • 6966
    个人资料
    等级:
    访问量: 1万+
    积分: 322
    排名: 24万+
    最新评论