1)设计上的区别:XML用来存储数据,重点在于数据本身,HTML用来定义数据,重在数据的显示模式。
2)XML可扩展性强,因为他本身就是可拓展性标记语言,课创建个性化的标记语言,提供更多数据操作。
3)XML语法比HTML严格。
4)起始标签和结束标签要匹配
5)嵌套标签不能相互嵌套
6)区分大小写
7)XML属性必须放在引号中,HTML可有可无。
8)XML必须有相应值,但HTML可以有不带属性的属性名。
1)两种形式 dtd schema。
2)本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
1.通过NuGet安装dll(2种方法)
1.1可以在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“管理NuGet包”,然后搜索“Free Spire.Doc”,点击“安装”。等待程序安装完成。
1.2将以下内容复制到PM控制台安装:
Install-Package FreeSpire.Doc -Version 10.2
2.手动添加dll引用
可通过手动下载包到本地,然后解压,找到BIN文件夹下的Spire.Doc.dll。然后在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“添加引用”,将本地路径BIN文件夹下的dll文件添加引用至程序。
转换时,可参考如下代码来进行:
C#
using Spire.Doc;
namespace HTMLtoXML
{
class Program
{
static void Main(string[] args)
{
//创建Document类的对象
Document doc=new Document();
//加载html文件
doc.LoadFromFile("sample.html",FileFormat.Html);
//保存为XML格式
doc.SaveToFile("HTMLtoXML.xml", FileFormat.Xml);
System.Diagnostics.Process.Start("HTMLtoXML.xml");
}
}
}
转换效果:
—End—
、安装
XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。
pip install lxml
二、使用案例
from lxml import etree
import requests
import asyncio
import functools
import re
import json
house_info=[]
'''异步请求获取链家每页数据'''
async def get_page(page_index):
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}
request=functools.partial(requests.get, f'https://sh.lianjia.com/ershoufang/pudong/pg{page_index}/',
headers=headers)
loop=asyncio.get_running_loop()
response=await loop.run_in_executor(None, request)
return response
'''使用xpath获取房屋信息'''
def get_house_info(html):
title_list=html.xpath('//a[@data-el="ershoufang"]/text()') # 房屋title
house_pattern_list=html.xpath('//div[@class="houseInfo"]/text()') # 房屋格局
price_list=html.xpath('//div[@class="unitPrice"]/span/text()') # 房屋单价
location_list=html.xpath('//div[@class="positionInfo"]') # 房屋位置信息
total_list=html.xpath('//div[contains(@class,"totalPrice")]') # 总价
for index, item in enumerate(zip(title_list, house_pattern_list, price_list)):
location_item=location_list[index]
total_item=total_list[index]
house_info.append({
'title': item[0],
'house_pattern': item[1],
'price': item[2],
'location': location_item.xpath('./a[1]/text()')[0] + location_item.xpath('./a[last()]/text()')[0],
'total': total_item.xpath('./span/text()')[0] + total_item.xpath('./i[last()]/text()')[0]
})
'''异步获取第一页数据,拿到第一页房屋信息,并返回分页总数和当前页'''
async def get_first_page():
response=await get_page(1)
#etree.HTML 将获取到的html字符串转为可操作的Element对象
get_house_info(etree.HTML(response.text))
if __name__=='__main__':
asyncio.run(get_first_page())
三、etree 模块
from lxml import etree
'''
element_name:要创建的元素的名称
attrib:元素的属性字典
nsmap:命名空间映射字典,用于指定元素的命名空间
'''
element=etree.Element('div',attrib={'class':'test'},nsmap={"ns": "http://example.com/ns"})
from lxml import etree
'''
parent:element对象
element_name:要创建的元素的名称
attrib:元素的属性字典
nsmap:命名空间映射字典,用于指定元素的命名空间
'''
element=etree.Element('div', attrib={'class': 'test'}, nsmap={"ns": "http://example.com/ns"})
span_element=etree.SubElement(element,'span')
span_element.text='我是span'
print(element.xpath('//div/span/text()'))
from lxml import etree
'''
text:解析的XML字符串
parse:解析器对象,默认lxml.etree.XMLParser、lxml.etree.HTMLParser
base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
'''
html_str='<div class="test"><span>我是span</span></div>'
element=etree.fromstring(html_str)
print(element.xpath('//div/span/text()'))
from lxml import etree
'''
xml_string:解析的XML字符串
parse:解析器对象,默认lxml.etree.HTMLParser
base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
'''
html_str='<div class="test"><span>我是span</span></div>'
element=etree.HTML(html_str)
print(element.xpath('//div/span/text()'))
from lxml import etree
'''
text:解析的XML字符串
parse:解析器对象,默认lxml.etree.XMLParser
base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
'''
html_str='<div class="test"><span>我是span</span></div>'
element=etree.XML(html_str)
print(element.xpath('//div/span/text()'))
四、element 对象
from lxml import etree
element=etree.Element('div', attrib={'class': 'test'})
span_element=etree.SubElement(element, 'span')
span_element.text='我是span'append_child=etree.Element('div', attrib={'class': 'append'})
append_child.text='我是append_child'insert_child=etree.Element('div', attrib={'class': 'insert'})
insert_child.text='我是insert_child'element.append(append_child)
element.insert(0,insert_child)
print(element.xpath('//div/span/text()'))
print(element.xpath('//div/div[@class="append"]/text()'))
print(element.xpath('//div/div[@class="insert"]/text()'))
五、elementTree 对象
六、parse 解析器对象
*请认真填写需求信息,我们会在24小时内与您取得联系。