Python基础入门之网络爬虫利器:lxml详解
作者:mmseoamin日期:2023-12-18

导语:网络爬虫是数据采集和信息提取的重要工具之一。在Python中,lxml库是一款功能强大且高效的网络爬虫工具,具有解析HTML和XML文档、XPath定位、数据提取等功能。本文将详细介绍lxml库的使用方法,并提供相应的代码示例

获取更多爬虫相关资源公众号:每日推荐系列!

lxml库

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

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

lxml python官方文档:http://lxml.de/index.html

Python基础入门之网络爬虫利器:lxml详解,第1张

 

lxml

  • lxml这个框架用于对xml文件进行格式化(说明:html文件是一种特殊xml)
  • 安装:pip install lxml
  • etree 全称是element tree这个工具用把一个html文件格式化成一个树形型结构,这个树形结构叫做节点树

    html测试页面

    
    
    
    	
    	测试页面
    
    
    	
    1. 醉卧沙场君莫笑,古来征战几人回
    2. 两岸猿声啼不住,轻舟已过万重山
    3. 一骑红尘妃子笑,无人知是荔枝来
    4. 停车坐爱枫林晚,霜叶红于二月花
    5. 商女不知亡国恨,隔江犹唱后庭花
    李白
    1. 君不见黄河之水天上来,奔流到海不复回
    2. 李白乘舟将欲行,忽闻岸上踏歌声
    3. 桃花潭水深千尺,不及汪伦送我情
    雷军
    1. are you ok
    2. Eric,会点编程

    1,安装lxml库:

    在开始之前,确保已经安装了Python和pip工具。使用pip命令可以简单地安装lxml库:

    2,导入lxml库:

    3,解析HTML文档:

    lxml可以解析HTML文档,并提供了多种解析器。下面是一个简单的示例,演示如何使用lxml解析HTML文档:

    html = """
    
    
      网页标题
    
    
      

    欢迎使用lxml

    这是一个示例文档

    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 获取标题 title = tree.findtext('.//title') print(title) # 输出:网页标题 # 获取

    标签下的文本 h1_text = tree.findtext('.//h1') print(h1_text) # 输出:欢迎使用lxml # 获取

    标签下的文本 p_text = tree.findtext('.//p') print(p_text) # 输出:这是一个示例文档

    4,深度解析XML文档:

    除了HTML文档,lxml还可以解析XML文档。下面是一个简单的示例,演示如何使用lxml解析XML文档:

    xml = """
    
      文本内容
    
    """
    # 创建解析器
    parser = ET.XMLParser()
    tree = ET.fromstring(xml, parser)
    # 获取属性值
    attribute_value = tree.find('.//element').get('attribute')
    print(attribute_value)  # 输出:value
    # 获取文本内容
    element_text = tree.findtext('.//element')
    print(element_text)  # 输出:文本内容
    

    5,XPath定位元素:

    lxml支持使用XPath表达式定位元素,这使得数据提取更加方便。下面是一个示例,演示如何使用XPath定位元素:

    html = """
    
    
      
    • 苹果
    • 香蕉
    • 橙子
    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 使用XPath获取
      下的所有
    • 元素 li_elements = tree.findall('.//ul/li') for li in li_elements: print(li.text) # 输出:苹果、香蕉、橙子

    6,属性选择器:

    在XPath中,可以使用属性选择器来定位具有特定属性的元素。下面是一个示例,演示如何使用属性选择器:

     
    
    html = """
    
    
      
    • 苹果
    • 香蕉
    • 西红柿
    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 使用属性选择器获取class为"fruit"的
  • 元素 fruit_elements = tree.findall('.//ul/li[@]') for fruit in fruit_elements: print(fruit.text) # 输出:苹果、香蕉
  • 7,CSS选择器:

    除了XPath,lxml还支持使用CSS选择器来定位元素。下面是一个示例,演示如何使用CSS选择器:

    html = """
    
    
      
    • 苹果
    • 香蕉
    • 西红柿
    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 使用CSS选择器获取class为"fruit"的
  • 元素 fruit_elements = tree.cssselect('ul li.fruit') for fruit in fruit_elements: print(fruit.text) # 输出:苹果、香蕉
  • 8,数据提取:

    lxml可以方便地提取元素中的数据。下面是一个示例,演示如何提取数据:

    html = """
    
    
      
    • 苹果
    • 香蕉
    • 西红柿
    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 使用XPath提取
  • 元素中的文本内容 li_elements = tree.findall('.//ul/li') fruits = [li.text for li in li_elements] print(fruits) # 输出:['苹果', '香蕉', '西红柿']
  • 9,修改元素:

    lxml不仅可以解析和提取数据,还可以修改元素。下面是一个示例,演示如何修改元素:

    html = """
    
    
      

    旧标题

    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 修改

    元素的文本内容 h1_element = tree.find('.//h1') h1_element.text = '新标题' # 将修改后的文档输出为字符串 new_html = ET.tostring(tree, encoding='unicode') print(new_html) # 输出: # # #

    新标题

    # #

    10,删除元素:

    除了修改元素,lxml还可以删除元素。下面是一个示例,演示如何删除元素:

    html = """
    
    
      
    • 苹果
    • 香蕉
    • 橙子
    """ # 创建解析器 parser = ET.HTMLParser() tree = ET.fromstring(html, parser) # 删除第一个
  • 元素 ul_element = tree.find('.//ul') li_elements = ul_element.findall('.//li') ul_element.remove(li_elements[0]) # 将修改后的文档输出为字符串 new_html = ET.tostring(tree, encoding='unicode') print(new_html) # 输出: # # #
      #
    • 香蕉
    • #
    • 橙子
    • #
    # #
  • 11,处理命名空间:

    当解析带有命名空间的XML文档时,可以使用lxml来处理命名空间。下面是一个示例,演示如何处理命名空间:

    xml = """
    
      文本内容
    
    """
    # 创建解析器
    parser = ET.XMLParser()
    tree = ET.fromstring(xml, parser)
    # 使用命名空间前缀获取元素
    element = tree.find('.//ns:element', namespaces={'ns': 'http://example.com'})
    print(element.text)  # 输出:文本内容
    

    12,解析大型文档:

    lxml对于大型文档的解析和处理非常高效。可以使用iterparse方法来迭代解析大型文档,从而减少内存占用。下面是一个示例,演示如何解析大型文档:

    xml = """
    
      元素1
      元素2
      元素3
      ...
      元素N
    
    """
    # 创建解析器
    parser = ET.iterparse(xml)
    # 迭代解析元素
    for _, element in parser:
        if element.tag == 'element':
            print(element.text)
            element.clear()
    

    13,错误处理:

    在使用lxml解析文档时,可能会遇到一些错误。可以通过捕获异常并进行错误处理来提高代码的健壮性。下面是一个示例,演示如何处理错误:

    html = """
    
    
      

    标题

    文本1

    文本2

    文本3

    """ # 创建解析器 parser = ET.HTMLParser() try: tree = ET.fromstring(html, parser) # 在此处进行数据提取等操作 except ET.ParseError: print("解析出错")

    14,lxml和xpath结合使用详解:

    from lxml import etree
    # 1. 获取所有tr标签
    # 2. 获取2个tr标签
    # 3. 获取所有class等于even的标签
    # 4. 获取所有a标签的href属性
    # 5. 获取所有的职位信息(纯文本)
     
    parser=etree.HTMLParser(encoding='utf-8')
    html=etree.parse('tencent.html',parser=parser)
     
    # 1. 获取所有tr标签
    # //tr
    trs=html.xpath("//tr")
    for tr in trs:
        print(etree.tostring(tr,encoding='utf-8').decode('utf-8'))
     
    # 2. 获取第2个tr标签
    trs=html.xpath("//tr[2]")
    print(trs)
    ''''''
    # 3. 获取所有class等于even的标签
    trs=html.xpath("//tr[@class='even']")
    for tr in trs:
        print(etree.tostring(tr,encoding='utf-8').decode('utf-8'))
     
    # 4. 获取所有a标签的href属性
    trs=html.xpath("//a/@href")
    for tr in trs:
        print(tr)
     
    # 5. 获取所有的职位信息(纯文本)
    trs=html.xpath("//tr[position()>1]")
    for tr in trs:
        #在某个标签下执行哦xpath()获取元素,注意加.表明在当前标签下获取
        href=tr.xpath(".//a/@href")[0]
        fullurl='http://hr.tencent.com'+ href
        title=tr.path("./td[1]/text()")[0]
        category=tr.path("./td[2]/text()")[0]
        nums = tr.path("./td[3]/text()")[0]
        address = tr.path("./td[4]/text()")[0]
        pubtime = tr.path("./td[5]/text()")[0]
        position={
            'url': fullurl,
            'title': title,
            'category': category,
            'nums':nums,
            'address': address,
            'pubtime': pubtime
        }

    总结:

    本文详细介绍了lxml库的使用方法,包括解析HTML和XML文档、XPath定位、数据提取、元素修改和删除、处理命名空间、解析大型文档等。lxml是一款功能强大且高效的网络爬虫工具,可以帮助你轻松地进行数据采集和信息提取。希望本文对你理解和应用lxml有所帮助!

    注意:本文代码示例仅作为参考,实际应用时请根据具体需求进行修改和优化。祝你在网络爬虫的道路上取得成功!