python爬虫解析HTML也是一项重要的任务,而选择合适的解析器就显得尤为重要了,下面为大家详细解析一下lxml解析库,
我信奉的是实践出真知,你看再多语法书不如自己动手敲出来,看看它到底实现的是什么功能,这样总比看书记得更加深刻吧。
pip install lxml后,把下面代码按着一点一点的敲出来执行一下吧,看见print你就可以执行一下,相信我,很好懂的。
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 26 16:29:07 2019
Describe:lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取。
市面上有很多现成的XML解析器,
但是为了获得更好的结果,
开发人员有时更愿意编写自己的XML和HTML解析器。
这时lxml库就派上用场了。
这个库的主要优点是易于使用,在解析大型文档时速度非常快,
归档的也非常好,并且提供了简单的转换方法来将数据转换为Python数据类型,从而使文件操作更容易。
@author: Grist Cheng
"""
from lxml import etree as et
root = et.Element('html',version="5.0")
#root.append(et.SubElement('style'))
et.SubElement(root,'head')
et.SubElement(root,'title',bgcolor="red",fontsize='22')
et.SubElement(root,'body',fontsize="15")
print(et.tostring(root,pretty_print=True).decode("utf-8"))
for e in root:
print(e.tag) #遍历root结点中的所有子结点并打印他们的标签
print("**************************************1")
#使用属性
root.set('newAttribute','attributeValue')
print(et.tostring(root,pretty_print=True).decode("utf-8"))
print("**************************************2")
#获取属性的值
print(root.get('newAttribute'))
print(root[1].get('alpha')) # access title element
print(root[1].get('bgcolor'))
print("**************************************3")
#从元素中检索文本
root.text = "This is an HTML file" #add text to the Element and SubElements
root[0].text="This is the head of the file"
root[1].text="This is the title of the file"
root[2].text="This is the body of the file and would contain paragraphs etc"
print(et.tostring(root,pretty_print=True).decode("utf-8"))
print("**************************************4")
#检查元素是否有子,父元素
print("检查根节点是否有子节点:")
if len(root) > 0: #根节点是否有子节点+
print("True")
else:
print("False")
print("检查根节点的子节点是否有子节点:")
for i in range(len(root)):
if(len(root[i]) > 0):
print("True")
else:
print("False")
print('\n')
print("分别获取父元素:")
print(root.getparent()) #根
print(root[0].getparent())
print(root[1].getparent())
print('\n')
print("检查title的同胞元素:")
print(root[1].getnext())#root[1] is the title tag,this is find after the title tag
print(root[1].getprevious())#find before the title tag
print('\n')
#解析原始xml和HTML文件
print("解析原始xml和HTML文件,更改了HTML文档中的一些文本。由于我们传递给tostring函数一个xml_declaration参数,所以还自动添加了XML doctype声明:")
root = et.XML('This is an HTML fileThis is the head of the fileThis is the title of the file This is the body of the file and would contain paragraphs etc')
root[1].text="The title text has changed!"
print(et.tostring(root,xml_declaration=True).decode('utf-8'))
print('\n')
#寻找元素
print(" 检查一些方法,通过这些方法,我们可以查看一个Element是否具有任何特定类型的子元素,以及它是否包含一些子元素。 ")
print(root.find('a'))
print(root.find('head').tag)
print(root.findtext('title'))