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.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'))
得到部分数据如下:
python开发工程师
[科技园]
09:42发布
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
文件的部分内容:
-