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小時內與您取得聯系。