2

lxmlを使用してURLからxmlを解析し、title属性の値を返す方法を理解しようとしています。誰かが私が間違っていること、またはタイトル値/テキストを返すものを知っていますか?したがって、以下の例では、「雑草-S05E05-ヴァンナイズ-HDTV」の値を返します。

URLからのXML:

<?xml version="1.0" encoding="UTF-8"?>
<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.8.0">
<song id="11345" parent="11287" title="Weeds - S05E05 - Van Nuys - HD TV" album="Season 5" artist="Weeds" isDir="false" created="2009-07-06T22:21:16" duration="1638" bitRate="384" size="782304110" suffix="mkv" contentType="video/x-matroska" isVideo="true" path="Weeds/Season 5/Weeds - S05E05 - Van Nuys - HD TV.mkv" transcodedSuffix="flv" transcodedContentType="video/x-flv"/>
</subsonic-response>

私の現在のPythonコード:

import lxml
from lxml import html
from urllib2 import urlopen

url = 'https://myurl.com'

tree = html.parse(urlopen(url))
songs = tree.findall('{*}song')
for song in songs:
    print song.attrib['title']

上記のコードでは、データが返されません、何かアイデアはありますか?

ツリーから印刷=

<lxml.etree._ElementTree object at 0x0000000003348F48>

曲を印刷する=

[]
4

3 に答える 3

3

まず第一に、あなたは実際lxmlにあなたのコードで使用していません。HTMLパーサーをインポートしlxmlますが、それ以外の場合は無視して、代わりに標準ライブラリxml.etree.ElementTreeモジュールを使用します。

次に、検索しますが、ドキュメントに要素data/songがないdataため、一致するものは見つかりません。最後になりましたが、名前空間を使用するドキュメントがあります。要素を検索するときにそれらを含めるか、{*}ワイルドカード検索を使用する必要があります。

以下はあなたのための曲を見つけます:

from lxml import etree

tree = etree.parse(URL)  # lxml can load URLs for you
songs = tree.findall('{*}song')
for song in songs:
    print song.attrib['title']

{*}明示的な名前空間を使用するには、ワイルドカードを完全な名前空間URLに置き換える必要があります。デフォルトの名前空間は、オブジェクトの.nsmap名前空間dictで使用できます。tree

namespace = tree.nsmap[None]
songs = tree.findall('{%s}song' % namespace)
于 2012-11-28T15:54:24.813 に答える
0

助けてくれてありがとう、私はそれを機能させるためにあなたの両方の組み合わせを使用しました。

import xml.etree.ElementTree as ET
from urllib2 import urlopen

url = 'https://myurl.com'
root = ET.parse(urlopen(url)).getroot()
for song in root:
    print song.attrib['title']
于 2012-11-28T17:52:59.790 に答える
0

全体的な問題は、subsonic-responseタグにxmlnsxml名前空間が有効であることを示す属性があるという事実にあります。以下のコードはそれを考慮に入れて、曲のタグを正しくピッグアップします。

import xml.etree.ElementTree as ET
root = ET.parse('test.xml').getroot()
print root.findall('{http://subsonic.org/restapi}song')
于 2012-11-28T15:56:11.850 に答える