0

次の XML を Python で解析しようとしています。私は使っている:

thumbnail_tag = dom.getElementsByTagName('media:thumbnail')[0].toxml()

これにより、最初のものが選択されます。[0]を に変更して[1]でタグを取得できることはわかってyt:name="mqdefault"いますが、上記のステートメントのパラメーターを変更する ( に何かを追加するmedia:thumbnail) 別の方法はありますか?

<entry>
<media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/default.jpg" height="90" width="120" time="00:01:48.500" yt:name="default" />
<media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/mqdefault.jpg" height="180" width="320" yt:name="mqdefault" />
<media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/hqdefault.jpg" height="360" width="480" yt:name="hqdefault" />
</entry>

<entry>
<media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/default.jpg" height="90" width="120" time="00:01:48.500" yt:name="default" />
<media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/mqdefault.jpg" height="180" width="320" yt:name="mqdefault" />
<media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/hqdefault.jpg" height="360" width="480" yt:name="hqdefault" />
</entry>
4

3 に答える 3

0

xml.etree.ElementTreeDOMの代わりに標準を使用することをお勧めします。DOMはより伝統的ですが、より醜く、使用するのがより困難です。Dive Into Python 3、第12章XMLをご覧ください。

標準モジュールは、XPath言語のサブセットをサポートしており、この場合に役立つ可能性があります。

sample.xml必要な要素を:から抽出するサンプルコードを次に示します。

import xml.etree.ElementTree as et

tree = et.parse('sample.xml')

root = tree.getroot()     # the root element of the tree

##et.dump(root)             # here is how the input file looks inside

print '==========================================='
print 'Iterate through all media:thumbnail:'

# XPath expressions that describe the wanted elements. Here we have 3 ones;
# however, they are just strings and can be constructed on the fly.
xp_default = ".//{http://search.yahoo.com/mrss/}thumbnail[" \
                 "@{http://gdata.youtube.com/schemas/2007}name='default']"

xp_mqdefault = ".//{http://search.yahoo.com/mrss/}thumbnail[" \
                 "@{http://gdata.youtube.com/schemas/2007}name='mqdefault']"

xp_hqdefault = ".//{http://search.yahoo.com/mrss/}thumbnail[" \
                 "@{http://gdata.youtube.com/schemas/2007}name='hqdefault']"

for e in root.iterfind(xp_default):
    et.dump(e)
    print '-------------------------------------------'

for e in root.iterfind(xp_mqdefault):
    et.dump(e)
    print '-------------------------------------------'

for e in root.iterfind(xp_hqdefault):
    et.dump(e)
    print '-------------------------------------------'
    print 'The e.attrib is a dictionary of attributes:'
    print e.attrib

次のように出力されます...:

c:\tmp\___python\sharataka\so12776774>py a.py
===========================================
Iterate through all media:thumbnail:
<ns0:thumbnail xmlns:ns0="http://search.yahoo.com/mrss/" xmlns:ns1="http://gdata
.youtube.com/schemas/2007" height="90" time="00:01:41" url="http://img.youtube.c
om/vi/jXE6G9CYcJs/default.jpg" width="120" ns1:name="default" />

-------------------------------------------
<ns0:thumbnail xmlns:ns0="http://search.yahoo.com/mrss/" xmlns:ns1="http://gdata
.youtube.com/schemas/2007" height="180" url="http://img.youtube.com/vi/jXE6G9CYc
Js/mqdefault.jpg" width="320" ns1:name="mqdefault" />

-------------------------------------------
<ns0:thumbnail xmlns:ns0="http://search.yahoo.com/mrss/" xmlns:ns1="http://gdata
.youtube.com/schemas/2007" height="360" url="http://img.youtube.com/vi/jXE6G9CYc
Js/hqdefault.jpg" width="480" ns1:name="hqdefault" />

-------------------------------------------
The e.attrib is a dictionary of attributes:
{'url': 'http://img.youtube.com/vi/jXE6G9CYcJs/hqdefault.jpg', 'width': '480', '
height': '360', '{http://gdata.youtube.com/schemas/2007}name': 'hqdefault'}

... sample.xml(どこかで見つかり、短縮された)コンテンツの場合:

<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
  xmlns:media='http://search.yahoo.com/mrss/'
  xmlns:yt='http://gdata.youtube.com/schemas/2007'>
  <entry>
    <media:group>
      <media:title type='plain'>Learning the ABCs</media:title>
      <media:description type='plain'>
        A great method for teaching kids the alphabet.
      </media:description>
      <media:keywords>alphabet, teaching, children</media:keywords>
      <yt:duration seconds='202'/>
      <yt:videoid>jXE6G9CYcJs</yt:videoid>
      <media:credit role='uploader' scheme='urn:youtube'
          yt:display='GoogleDeveloperssFriend'>GoogleDeveloperssFriend</media:credit>
      <media:category label='Education'
        scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>
        Education</media:category>
      <media:content url='http://www.youtube.com/v/jXE6G9CYcJs'
        type='application/x-shockwave-flash' medium='video' isDefault='true'
        expression='full' duration='202' yt:format='5'/>
      <media:content
        url='rtsp://rtsp2.youtube.com/ChoLENySANFEgGDA==/0/0/0/video.3gp'
        type='video/3gpp' medium='video' expression='full'
        duration='202' yt:format='1'/>
      <media:content
        url='rtsp://rtsp2.youtube.com/ChoLENySARFEgGDA==/0/0/0/video.3gp'
        type='video/3gpp' medium='video' expression='full'
        duration='202' yt:format='6'/>
      <media:player url='https://www.youtube.com/watch?v=jXE6G9CYcJs'/>
      <media:thumbnail url='http://img.youtube.com/vi/jXE6G9CYcJs/default.jpg'
        height='90' width='120' time='00:01:41' yt:name='default'/>
      <media:thumbnail url='http://img.youtube.com/vi/jXE6G9CYcJs/hqdefault.jpg'
        height='360' width='480' yt:name='hqdefault'/>
      <media:thumbnail url='http://img.youtube.com/vi/jXE6G9CYcJs/mqdefault.jpg'
        height='180' width='320' yt:name='mqdefault'/>
      <media:thumbnail url='http://img.youtube.com/vi/jXE6G9CYcJs/1.jpg'
        height='90' width='120' time='00:00:50.500' yt:name='start'/>
      <media:thumbnail url='http://img.youtube.com/vi/jXE6G9CYcJs/2.jpg'
        height='90' width='120' time='00:01:41' yt:name='end'/>
      <media:thumbnail url='http://img.youtube.com/vi/jXE6G9CYcJs/3.jpg'
        height='90' width='120' time='00:02:31.500' yt:name='middle'/>
    </media:group>
    <yt:statistics viewCount='286355' favoriteCount='201'/>
  </entry>
</feed>
于 2012-10-08T08:54:26.330 に答える
0

この xml 文字列の dom オブジェクトを作成するには、ルート タグまたは同じタグでXML 名前空間を定義する必要があります。

名前空間は、要素の先頭にあるxmlns 属性によって定義されます。

名前空間宣言の構文は次のとおりです。

xmlns:prefix="URI"

例えば:

<root>
    <h:table xmlns:h="http://bluejson.com/W3C/">
        <h:tr>
            <h:td>JSON</h:td>
            <h:td>JavaScript</h:td>
            <h:td>Python</h:td>
        </h:tr>
    </h:table>

    <f:table xmlns:f="http://bluejson.com/W3C/">
        <f:name>My Study Room</f:name>
        <f:width>800</f:width>
        <f:height>420</f:height>
        <f:length>1120</f:length>
    </f:table>
</root>

上記の例では、タグの xmlns 属性により、h: および f: プレフィックスに修飾された名前空間が与えられます。

要素に名前空間が定義されると、同じプレフィックスを持つすべての子要素が同じ名前空間に関連付けられます。

名前空間は、それらが使用される要素または XML ルート要素で宣言できます。

<root xmlns:h="http://bluejson.com/W3C/" xmlns:f="http://bluejson.com/W3C/">
    <h:table>
        <h:tr>
            <h:td>JSON</h:td>
            <h:td>JavaScript</h:td>
            <h:td>Python</h:td>
        </h:tr>
    </h:table>

    <f:table>
        <f:name>My Study Room</f:name>
        <f:width>800</f:width>
        <f:height>420</f:height>
        <f:length>1120</f:length>
    </f:table>
</root>

さて、xml dom オブジェクトを作成して属性を取得するための Python コード

import xml.dom.minidom

dom = xml.dom.minidom.parseString("""
<root xmlns:media="http://media/" xmlns:yt="http://media/yt/">
    <media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/default.jpg" height="90" width="120" time="00:01:48.500" yt:name="default" />
    <media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/mqdefault.jpg" height="180" width="320" yt:name="mqdefault" />
    <media:thumbnail url="http://i.ytimg.com/vi/k8J-72MmTGg/hqdefault.jpg" height="360" width="480" yt:name="hqdefault" />
</root>""")

media_thumbnail = dom.getElementsByTagNameNS("http://media/","thumbnail")
print media_thumbnail[0].getAttribute("height")
print media_thumbnail[0].getAttribute("width")
print media_thumbnail[0].getAttribute("time")
print media_thumbnail[0].getAttributeNS("http://media/yt/","name")
media_thumbnail[0].setAttribute("unit","px")
media_thumbnail[0].setAttributeNS("http://media/yt/","value","1")
print dom.toxml()

出力:

90
120
00:01:48.500
default
<?xml version="1.0" ?><root xmlns:media="http://media/" xmlns:yt="http://media/yt/">
    <media:thumbnail height="90" time="00:01:48.500" unit="px" url="http://i.ytimg.com/vi/k8J-72MmTGg/default.jpg" value="1" width="120" yt:name="default"/>
    <media:thumbnail height="180" url="http://i.ytimg.com/vi/k8J-72MmTGg/mqdefault.jpg" width="320" yt:name="mqdefault"/>
    <media:thumbnail height="360" url="http://i.ytimg.com/vi/k8J-72MmTGg/hqdefault.jpg" width="480" yt:name="hqdefault"/>
</root>
于 2012-10-08T09:22:38.060 に答える