lxml解析器的使用

lxml

lxml是一个HTML/XML的解析器,主要的功能是解析和提取HTML/XML数据

lxml和正则一样,用C实现的,是一种高性能的python HTML/XML解析器,我们可以利用之前学习的XPath语法,快速定位特定元素以及节点信息。

基本使用

1、导入相应的库:

from lxml import etree

2、解析html字符串,可以直接使用 lxml.etree.HTML 进行解析:

# 解析已有html字符串
def parse_text():
    # 默认为HTML解析器
    htmlElement = etree.HTML(text) # 解析html字符串
    print(etree.tostring(htmlElement, encoding='utf-8').decode('utf-8'))# 'utf-8'编码并解码

3、解析html文件,使用 lxml.etree.parse 进行解析:

# 解析文件中的html字符串
def parse_lagou_file():
    parser = etree.HTMLParser(encoding='utf-8')
    # 默认为XML解析器,需手动改成使用HTML解析器,否则有时会报错(开始和结束的标签不匹配)
    htmlElement = etree.parse("lagou1.html",parser=parser)
    print(etree.tostring(htmlElement, encoding='utf-8').decode('utf-8'))

lxml.etree.parse函数默认使用的是XML解析器,若遇到一些不规范的html代码时会出现解析错误,此时需要传入etree.HTMLParser作为参数,即创建HTML解析器。

lxml与xpath结合

首先,导入相应的库,使用 lxml.etree.parse 进行解析,并改成HTML解析器:

parser = etree.HTMLParser(encoding='utf-8')
htmlElement = etree.parse("lagou1.html",parser=parser)

1、获取所有div标签:

# //div
# xpath函数返回的是一个列表
divs = htmlElement.xpath("//div")
for div in divs:
    # print(div)   # div为Element形式,需使用tostring函数转成字符串输出('utf-8'编码解码)
    print(etree.tostring(div, encoding='utf-8').decode('utf-8'))

2、获取第二个div标签:

div = htmlElement.xpath("//div[2]")[0]
# print(div)
print(etree.tostring(div, encoding='utf-8').decode('utf-8'))

3、获取所有class等于p_top的标签(以class="p_top"为例):

divs = htmlElement.xpath("//div[@class='p_top']")
for div in divs:
    print(etree.tostring(div, encoding='utf-8').decode('utf-8'))

得到部分数据如下:



4、获取所有a标签的href属性(对应的url)

alist = htmlElement.xpath("//a/@href")
for a in alist:
    print(a)

5、获取所有的职位信息(纯文本)

divs = htmlElement.xpath("//div[position()>1]")
i = 1

money_list=[]
title_list=[]
url_list=[]
company_list=[]
for div in divs:
    # 在某个标签下,执行xpath函数来获取该标签下的子孙元素时,应该使用.//代表在当前元素下获取
    href = div.xpath(".//a/@href")
    company = div.xpath(".//a/text() ")
    money_title = div.xpath(".//span//text()")
    if i % 6 == 2:
        url_list.append(href[0])
        # print(href[0])
        company_list.append(company[0])
        # print(company[0])
    if i%6 == 1:
        money_list.append(money_title[0])
        # print(money_title[0])
    if i%6 == 5:
        title_list.append(money_title[0])
        # print(money_title[0])
    i += 1

部分输出:

腾讯
Python
15k-30k
https://www.lagou.com/gongsi/3060.html
华为技术有限公司
后端
10k-15k
https://www.lagou.com/gongsi/117921827.html
华盛天成
Python
15k-30k
https://www.lagou.com/gongsi/124262.html
MINIEYE
Python
15k-30k
https://www.lagou.com/gongsi/340054.html
微赢世纪
服务器端

为了方便大家对代码能更好的理解,此处附上lagou1.html文件的部分内容:

你可能感兴趣的:(爬虫)