我有一個 XML 檔案,我嘗試在其中查找特定標簽。但標簽在雇傭順序上是不同的。我嘗試找到標簽“MotionVectore”,然后計算特定幀型別(P、B 或 I 幀)的平均運動矢量值。在下面我放了這個 XML 檔案的一部分:
<Picture id="1" poc="1">
<GOPNr>0</GOPNr>
<SubPicture structure="0">
<Slice num="0">
<Type>0</Type>
<TypeString>SLICE_TYPE_P</TypeString>
<NAL>
<Num>5</Num>
<Type>1</Type>
<TypeString>NALU_TYPE_SLICE</TypeString>
<Length>47048</Length>
</NAL>
<MacroBlock num="0">
<MotionVector list="0">
<RefIdx>0</RefIdx>
<Difference>
<X>184</X>
<Y>149</Y>
</Difference>
<Absolute>
<X>184</X>
<Y>149</Y>
</Absolute>
</MotionVector>
正如你所看到的標簽的順序來實作X和Y值是Picture/SubPicture/Slice/MacroBlock/MotionVector/Absolute/X但有時這個順序是Picture/SubPicture/Slice/MacroBlock/SubMacroBlock/MotionVector/Absolute/X這樣的,當我使用這個代碼時
abs_x_tag=list(qpy_node.text for qpy_node in root.findall('Picture/SubPicture/Slice/MacroBlock/SubMacroBlock/MotionVector/Absolute/X'))
要提取所有X值,它無法提取所有X值,而且我必須根據此標簽計算不同幀型別的運動向量
<TypeString>SLICE_TYPE_P</TypeString>
并且基于這些限制,我不知道如何分別提取每種幀型別的X和Y值。我可以使用提到的代碼提取所有X和Y值,但我不知道如何根據幀的型別找到這些值。你能幫我解決這個問題嗎?謝謝。
uj5u.com熱心網友回復:
這里有一個例子,你如何用BeautifulSoup決議這個 xml
安裝 BeautifulSoup 和 lxml
pip install BeautifulSoup4 lxml
代碼:
from bs4 import BeautifulSoup
XML = """
<Picture id="1" poc="1">
<GOPNr>0</GOPNr>
<SubPicture structure="0">
<Slice num="0">
<Type>0</Type>
<TypeString>SLICE_TYPE_P</TypeString>
<NAL>
<Num>5</Num>
<Type>1</Type>
<TypeString>NALU_TYPE_SLICE</TypeString>
<Length>47048</Length>
</NAL>
<MacroBlock num="0">
<MotionVector list="0">
<RefIdx>0</RefIdx>
<Difference>
<X>184</X>
<Y>149</Y>
</Difference>
<Absolute>
<X>184</X>
<Y>149</Y>
</Absolute>
</MotionVector>
</MacroBlock>
</Slice>
</SubPicture>
</Picture>
"""
soup = BeautifulSoup(XML, 'xml')
slices = soup.find_all('Slice')
for slice in slices:
type = slice.find('TypeString').text
print(f"Type: {type}")
vectors = slice.find_all('MotionVector')
for vector in vectors:
print("Vector:")
difference = vector.find('Difference')
difference_x = difference.find('X').text
difference_y = difference.find('Y').text
absolute = vector.find('Absolute')
absolute_x = absolute.find('X').text
absolute_y = absolute.find('Y').text
# Here you know type and x, y and type
print(f"Difference: {difference_x}, {difference_y}")
print(f"Absolute: {absolute_x}, {absolute_y}")
輸出:
Type: SLICE_TYPE_P
Vector:
Difference: 184, 149
Absolute: 184, 149
uj5u.com熱心網友回復:
我們可以通過一種簡單的方式來完成,并查看下面的輸出:
import xml.etree.ElementTree as ET
SampleXML = """
<Picture id="1" poc="1">
<GOPNr>0</GOPNr>
<SubPicture structure="0">
<Slice num="0">
<Type>0</Type>
<TypeString>SLICE_TYPE_P</TypeString>
<NAL>
<Num>5</Num>
<Type>1</Type>
<TypeString>NALU_TYPE_SLICE</TypeString>
<Length>47048</Length>
</NAL>
<MacroBlock num="0">
<MotionVector list="0">
<RefIdx>0</RefIdx>
<Difference>
<X>184</X>
<Y>149</Y>
</Difference>
<Absolute>
<X>184</X>
<Y>149</Y>
</Absolute>
</MotionVector>
</MacroBlock>
</Slice>
</SubPicture>
</Picture>
"""
# use below commented lines if you are reading from xml file and replace XMl absolute path with <InputXML>
# tree = ET.parse(r"<InputXML>")
# root = tree.getroot()
root = ET.fromstring(SampleXML)
TypeString = root.findall("./SubPicture/Slice/TypeString")
print("TypeString: ", TypeString[0].text)
abs_x_tag = root.findall("./SubPicture/Slice/MacroBlock/MotionVector/Absolute/X") or root.findall("./SubPicture/Slice/MacroBlock/SubMacroBlock/MotionVector/Absolute/X")
print("abs_x_tag: ", abs_x_tag[0].text)
輸出:
型別字串:SLICE_TYPE_P
abs_x_tag:184
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/396653.html
