国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
python – 使用lxml解析奇怪的結(jié)構(gòu)化XML

我有許多需要解析的XML文件.我寫了一些有用的代碼,但很難看,我想從比我更有經(jīng)驗(yàn)的人那里得到一些建議.

首先,我可能在錯(cuò)誤的上下文中使用了一些術(shù)語(yǔ),因?yàn)槲覍?duì)XML的經(jīng)驗(yàn)是有限的.按元素,除非另有說(shuō)明,我的意思是這樣的:

 <root>  <element>   ...  </element>  <element>   ...  </element> </root>  

無(wú)論如何,每個(gè)文件都包含許多元素,其中包含許多子元素(顯然).讓我感到困惑的是,需要以四種不同的方式獲取相關(guān)的價(jià)值觀;

1)節(jié)點(diǎn)文本:

<tag>value</tag>

2)屬性:

<tag attribute="value"></tag>

3)標(biāo)簽內(nèi)“隱藏”的值(在這種情況下為“true”):

<tag><boolean.true/></tag>

4)同名標(biāo)簽內(nèi)的值(“tagA”),但具有不同名稱的“祖父母”標(biāo)簽(“tag1”和“tag2”),都在同一元素內(nèi). “tagA”對(duì)我沒(méi)用,相反我會(huì)尋找“tag1”和“tag2”.

<element>   <tag1><tagA>value</tagA><tag1>   <tag2><tagA>value</tagA></tag2></element>

目前我有一個(gè)字典,每個(gè)文件都是一個(gè)關(guān)鍵字.值是帶有“屬性”,“節(jié)點(diǎn)文本”,“標(biāo)記”和“父元素”鍵的字典.

例:

{'file1.xml' : 'attributes' : {'Person': 'Id', 'Car' : 'Color'},               'node text': ['Name', 'Address'],}

“Person”和“Car”是標(biāo)簽,“Id”和“Color”是屬性名稱.

這使得迭代所有元素并檢查每個(gè)標(biāo)記變得容易,如果字典中存在匹配(如果dict [‘file1.xml’] [‘a(chǎn)ttributes’]中的elem.tag),則提取值.

正如我所說(shuō),代碼有效,但我不喜歡我的解決方案.此外,并非所有元素都具有所有子元素(例如,Person可能沒(méi)有汽車,那么該標(biāo)簽將完全丟失),我需要將這些值分配給“None”.現(xiàn)在我得到每個(gè)文件中每個(gè)元素應(yīng)該存在的所有標(biāo)記,將它們變成一個(gè)集合,然后檢查它們與我實(shí)際從該元素中提取值的標(biāo)記集之間的差異.再一次,代碼非常難看.

希望這個(gè)爛攤子有道理.

編輯:

我使用了J.F.Sebastian建議將xpath存儲(chǔ)到字典中的每個(gè)值,字段名稱為鍵,xpath為值.

解決方法:

您可以使用相對(duì)于元素的xpath表達(dá)式而不是復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來(lái)簡(jiǎn)化輸入代碼,例如,#1-4情況:

>標(biāo)簽/文字()
> tag / @ attribute
> name(DTBoolean / * [1])
>(tag1 | tag2)/ * / text()

要使用哪種輸出數(shù)據(jù)結(jié)構(gòu)取決于您希望以后如何在代碼中使用它.您可以從對(duì)當(dāng)前代碼最方便的結(jié)構(gòu)開始.當(dāng)您更好地理解要求時(shí),將其演變?yōu)楦ㄓ玫慕鉀Q方案.

I output it to csv, where each element is one row in the csv file.

I use a defaultdict to store the elements and then store those in a list before I output them to csv.

你可以使用普通的dict和csv.DictWriter(fieldnames = xpathdict.keys()):

# for each elementrow_dict = dict.fromkeys(xpathdict.keys())...# for each key row_dict[key] = element.xpath(xpathdict[key]) or None...dictwriter.writerow(row_dict)

其中xpathdict是字段名稱和相應(yīng)的xpath表達(dá)式之間的映射.一般來(lái)說(shuō),你可以存儲(chǔ)函數(shù)對(duì)象f(元素) – > csv字段而不是/除xpath exprs之外.

來(lái)源:https://www.icode9.com/content-1-413451.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
lxml 學(xué)習(xí)筆記
2020年,那些已經(jīng)死亡的公司
lxml類庫(kù)的介紹文檔
lxml簡(jiǎn)明教程
Selenium2+python自動(dòng)化6
【python】用selenium webdriver做簡(jiǎn)單的表格提交
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服