xpath 解析(基础)

解析xml

首先要下载包:pip install lxml

基本使用如下代码所示:

# xpath 解析:先安装lxml:pip install lxml
from lxml import etree

xml = """

    1
    山花遍地开
    9.99
    臭豆腐
    
        周六福
        周杰伦
        蔡依林
        
呼哈1
呼哈2
胖胖哒 nonono
""" # etree.XML(xml) 表示解析的字符串是XML # 此外还有etree.HTML(text) 表示解析的是HTML # etree.parse('文件路径') 可以传入一个文件,然后解析该文件 tree = etree.XML(xml) # 获取book节点 book = tree.xpath('/book') # /表示层级关系,第一个/是根节点 print(book) # [] # 获取book节点下的name节点 name = tree.xpath('/book/name') print(name) # [] # text() 获取节点的文本内容 # 获取name节点的文本内容 name_text = tree.xpath('/book/name/text()') print(name_text) # ['山花遍地开'] # 获取author节点下的nick儿子节点,即直接被author节点包裹,而不是隔着其他节点的 # 如"周六福"、"周杰伦"、"蔡依林"是被直接包裹,而"呼哈1"隔着一层div节点 author_son_nick = tree.xpath('/book/author/nick/text()') print(author_son_nick) # ['周六福', '周杰伦', '蔡依林'] # // 表示获取父节点下的某个名称的所有子节点,包括儿子、孙子、重孙子等 # 如此处获取author节点下的所有nick节点,包括直接包裹和隔着其他节点的,只要是在author下的都算 author_offspring_nick = tree.xpath('/book/author//nick/text()') print(author_offspring_nick) # ['周六福', '周杰伦', '蔡依林', '呼哈1', '呼哈2'] # * 通配符,可以匹配任意的节点 # 如此处*可以匹配div节点和span节点,得到author节点下的div和span下的nick节点 # 即“呼哈1”、“呼哈2” nick = tree.xpath('/book/author/*/nick/text()') print(nick) # ['呼哈1', '呼哈2']

解析html

test.html代码如下:




    
    Title


    

标题1

标题2

标题3

段落

使用xpath解析test.hml文件:

# 注意,以下注释中的标签、节点、元素都是一个意思,只是叫法不用
# 对一个HTML文件进行解析
tree = etree.parse('test.html')

# 获取html节点
html = tree.xpath('/html')
print(html)  # []

# 获取div节点下ul里的li标签中的两个a标签里文本
as_text = tree.xpath('/html/body/div/ul/li/a/text()')
print(as_text)  # ['百度', '爱奇艺']

# [index] 中括号加索引表示获取第index个标签,注意索引从1开始
# 获取ul里的第一个li标签下的a标签中的文本
first_a_text = tree.xpath('/html/body/div/ul/li[1]/a/text()')
print(first_a_text)  # ['百度']

# [@属性名=属性值] 根据某个属性值获取指定节点
# 获取class属性为"iqiyi"的a标签
iqiyi_a = tree.xpath('/html/body/div/ul/li/a[@class="iqiyi"]/text()')
print(iqiyi_a)  # ['爱奇艺']

# 遍历ul中的li
ul_li_list = tree.xpath('/html/body/div/ul/li')
print(ul_li_list)  # [, ]
for li in ul_li_list:
    # ./表示相对当前节点,即相对li查找a标签
    a_text = li.xpath('./a/text()')
    print(a_text)  # 分别打印['百度']、['爱奇艺']

    # @属性名 表示获取标签的某个属性值
    # 打印a标签的href属性
    href = li.xpath('./a/@href')
    print(href)  # 分别打印['http://www.baidu.com']、['http://www.iqiyi.com']

# 一次性获取div节点下ul里的li标签中的两个a标签的href属性值(和获取文本类似)
href_val = tree.xpath('/html/body/div/ul/li/a/@href')
print(href_val)  # ['http://www.baidu.com', 'http://www.iqiyi.com']

你可能感兴趣的:(#,python,爬虫——数据解析,python,开发语言,爬虫)