1

フィードを解析する必要がありますが、要素(タグ)の1つはcolon <dc:creator>leemore23</dc:creator>

どうすればそれを使用して解析できlxmlますか?だから私はこのようにそれをしました

r = requests.get('http://www.site.com/feed/')
foo = (r.content).replace("dc:creator","dc")
tree = lxml.etree.fromstring(foo)
for article_node in tree.xpath('//item'):
    data['dc'] = article_node.xpath('.//dc')[0].text.strip()

でももっと良い方法があると思います

data['dc'] = article_node.xpath('.//dc:creator')[0].text.strip()

また

data['dc'] = article_node.xpath('.//dc|creator')[0].text.strip()

交換せずに

何をアドバイスできますか?

4

2 に答える 2

3

dc:プレフィックスはXML名前空間を示します。inputから削除するだけでなく、 elementtreeAPI名前空間サポートを使用して処理します。たまたま、dc通常はダブリンコアメタデータを指します。

完全な名前空間URLを決定してから、XPathクエリでそのURLを使用する必要があります。

DCNS = 'http://purl.org/dc/elements/1.1/'
creator = article_node.xpath('.//{{{0}}}creator'.format(DCNS))

ここではhttp://purl.org/dc/elements/1.1/、ダブリンコアプレフィックスに推奨される名前空間URLを使用しました。

通常、.nsmapプロパティからURLを判別できます。ルート要素にはおそらく次の.nsmap属性があります。

{'dc': 'http://purl.org/dc/elements/1.1/'}

したがって、コードを次のように変更できます。

creator = article_node.xpath('.//{{{0}}}creator'.format(article_node.nsmap['dc']))

nsmapこれは、辞書をキーワードxpath()としてメソッドに渡すことでさらに簡略化できますnamespaces。その時点で、xpath式でプレフィックスを使用できます。

creator = article_node.xpath('.//dc:creator', namespaces=article_node.nsmap)
于 2012-11-20T11:10:10.750 に答える
2

dc:名前空間を示します。lxmlxpathメソッドを使用する場合は、パラメータnamespaces使用して名前空間内の要素を検索します。

したがって、あなたの場合、@MartijnPietersによって提供されるdublinコアプレフィックスを使用して、

r = requests.get('http://www.site.com/feed/')
tree = lxml.etree.fromstring(r.content)
ns = {'dc':'http://purl.org/dc/elements/1.1/'}
for article_node in tree.xpath('//item'):
    data['dc'] = article_node.xpath('.//dc:creator', namespaces = ns)[0].text.strip()
于 2012-11-20T11:22:16.467 に答える