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