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