python爬虫系列四:html解析大法-lxml-xpath

Xpath原本是在可扩展标记语言XML中进行数据查询的一种描述语言,可以很方便的在XML文档中查 询到具体的数据;后续再发展过程中,对于标记语言都有非常友好的支持,如超文本标记语言HTML。
正如在python中有一个内置的re模块用来支持正则表达式
语法一样,python中有一个第三方的lxml模块,可以方便
的支持Xpath的各种操作,可以友好的解析Xpath语法,使
其用于在程序中进行结构化数据筛选。
安装命令: pip install lxml

XPath常用规则

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

案例

etree大部分节点都在这个函数里面

from lxml import etree

html_DOC="""
<html>
    <head>
       <title>春晚</title>
    </head>
    <body>
       <h1 name="title">个人简介</h1>
       <div name="desc">
           <p name="name">姓名:<span>小岳岳</span></p>
           <p name="addr">住址:中国 河南</p>
           <p name="info">代表作:五环之歌</p>
        </div>
"""

#初始化
html=etree.HTML(html_DOC)
#print(type(html))  #<class 'lxml.etree._Element'> 获取的网页只有转化etree的格式才能被xpath解析

#(1) 查询html中div标签下的所有的p标签
print(html.xpath("//div/p"))
#三个标签p是以列表形式展现出来:[<Element p at 0x28b3ac8>, <Element p at 0x28b3a88>, <Element p at 0x28b3b88>]

#(2) 查询第二个p标签的name属性值
print(html.xpath("//div/p[2]/@name"))
#加属性值必须是用@:['addr']

#(3)查询div下的p标签下的span标签内容
print(html.xpath("//div/p/span")[0].text)
#"//div/p/span"得到的结果是[<Element span at 0x28acb08>],内容是Element元素,列表获取第一个元素,转化成text格式:小岳岳

#(4)查询body标签下的h1标签的name属性值
print(html.xpath("//body/h1/@name"))
#['title']

#(5)查询所有的包含name属性,并且name属性值为desc的标签
print(html.xpath("//*[@name='desc']"))
#查询所有的用*
#name='desc'是谓语,放在[]里
#属性值用@
#[<Element div at 0x288db48>]

#(6)查询第一个p标签内的所有文本数据
#string():获取包括子孙标签在内的所有文本数据
#text:只能获取该标签下的文本,不包括子孙标签的文本
print(html.xpath('string(//p[1])'))
print(html.xpath("//p[1]")[0].text) #只能获取第一个元素:姓名:

猜你喜欢

转载自blog.csdn.net/qq_42787271/article/details/81613076