• Python_lxml解析HTML


    1.Python解析XML的常用方法有以下几种:

    1、DOM解析, xml.dom.*模块。
    2、SAX解析, xml.sax.*模块。
    3、ET解析,  xml.etree.ElementTree模块。
    4、lxml解析,并结合XPath提取元素。
    

    01.说明:

    lxml有两大部分,分别支持XML和HTML的解析:
        lxml.etree 解析 XML
        lxml.html  解析 html
    from lxml import etree, html
    

    02.lxml解析

    #01.导入相关标准库
       from lxml import etree
    #02.定义解析器
        parser = etree.XMLParser(encoding = "utf-8")
    #03.使用解析器parser解析XML文件
       tree = etree.parse(r"my.xml",parser = parser)
    #04.结合xpath提取XML文件中的信息-即使用 xpath 语法提取网页元素
       mytext = tree.xpath('//loc/text()')
    

    2.Python解析HTML

    lxml 
        自2.0版本起有了专门用于处理html的模块 lxml.html, 
          模块中包含几种解析html的方式, :
    
          from lxml.html import fromstring, soupparser, html5lib
            fromstring   Parse the html, returning a single element/document.:解析字符串
            soupparser  """External interface to the BeautifulSoup HTML parser.
    		             lxml can make use of BeautifulSoup as a parser backend, 
    					    just like BeautifulSoup can employ lxml as a parser.
        #解析器
            lxml.html     中的 解析器  
            BeautifulSoup4中的 解析器
    
    #提取工具
    可以使用 find 、findall 或者 XPath 来搜索Element包含的标签对象
    XPath,全称XML Path Language,即XML路径语言
    	标签定位   从根节点选取  任意位置的某个节点  选取属性
    	           使用@符号即可获取节点的属性  某个属性的值有多个时,我们可以使用contains()函数来获取
    			   text()方法获取节点中的文本
    	序列定位   利用中括号引入索引的方法获取特定次序的节点 第一个元素  所有lang='en'的元素
    	轴定位     XPath提供了很多节点选择方法,包括获取子元素、兄弟元素、父元素、祖先元素等
    	XPath中的运算符
    
    Bs4:from bs4 import BeautifulSoup
       BeautifulSoup(markup, "html.parser")
       BeautifulSoup(markup, "lxml") BeautifulSoup(markup, ["lxml-xml"])  BeautifulSoup(markup, "xml")
       BeautifulSoup(markup, "html5lib")
       
       Tag,它有两个重要的属性,是 name 和 attrs
    

    3.HTML

     <!DOCTYPE html> 声明为 HTML5 文档
     <html> 	元素是 HTML 页面的根元素
     <head> 	元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8。
     <title> 	元素描述了文档的标题
     <body> 	元素包含了可见的页面内容
     <h1> 		元素定义一个大标题  HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的。
     <p> 		元素定义一个段落    HTML 段落是通过标签 <p> 来定义的
     <a>  		HTML 链接是通过标签 <a> 来定义的 ref 属性中指定链接的地址。
     <br>	换行
     HTML 分组标签
      <div>	定义了文档的区域,块级 (block-level)  div 元素来创建多列布局
      <span>用来组合文档中的行内元素, 内联元素(inline)
     
     表格: 表格由 <table> 标签来定义。
             <tbody>	定义表格的主体
             每个表格均有若干行(由 <tr> 标签定义),
    		 每行被分割为若干单元格(由 <td> 标签定义)。字母 td 指表格数据(table data),即数据单元格的内容
     
     
      HTML 标签 (HTML tag) 开始标签与结束标签
      属性:总是以名称/值对的形式出现,比如:name="value" 
             class  id  style  title
    		 style	规定元素的行内样式(inline style)
     <style type="text/css">
    

    4.代码示例

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    import requests
    from lxml import etree
    
    if __name__ == "__main__":
        pass
        url = r"https://www.9145"
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                                 "Chrome/51.0.2704.103 Safari/537.36"}
    	# 下载数据
        response = requests.get(url_01, headers=headers)
    	#HTML parse 解析器
        html = etree.HTML(response.content.decode('utf-8'))
    
        # 解析HTML,筛选数据
        # XPath使用路径表达式来选取XML文档中的节点或者节点集
        df = html.xpath('//table[contains(@class, "")]/tbody/tr//td//text()')
        mid_deal_ls = []
        for data in df:
            field_string = "".join(data.strip().split())
            if field_string != '':
                mid_deal_ls.append(field_string)
        info = ["项目", "用途"]
        for want_dat in info:
            for own_data in mid_deal_ls:
                if own_data == want_dat:
                    print(want_dat, mid_deal_ls[mid_deal_ls.index(want_dat)+1])
        # get name and location
        house_info_df = html.xpath('//div[contains(@class, "spf_del_title clearfix")]//h2//text()')
        name_location = []
        for location_data in house_info_df:
            field_string = "".join(location_data.strip().split())
            if field_string not in ('', "[", "]"):
                name_location.append(field_string)
        print("name", name_location[0])
        print("location", name_location[1])
    

    5.参考

      https://beautifulsoup.readthedocs.io/zh_CN
  • 相关阅读:
    更新glibc,删除libc库后,命令行都不能使用了
    进程和线程、协程的区别
    PMP项目管理--资源管理
    清除缓存 echo 1/2/3 > /proc/sys/vm/drop_caches
    gdb malloc方法
    随时更新---能力集
    输出gdb调试信息到文件中
    主动生成core文件 gcore +pid
    PMP项目管理--风险管理
    linux后台程序
  • 原文地址:https://www.cnblogs.com/ytwang/p/15038887.html
Copyright © 2020-2023  润新知