web-dev-qa-db-ja.com

pythonまたはPerlなどを使用してxmlで特定の文字列を取得する方法

ここから私は(ユーザー名) "pelech"だけを取得する必要があります。これは、私のxmlファイルの例であり、1000人のユーザーがいます。

<user>
    <login>pelech</login>
    <password>passwords are saved outside</password>
</user>

次のスクリプトを試してみましたが、機能しません。

import xml.etree.ElementTree as ET

tree = ET.parse("users.xml")
root = tree.getroot()
for app in root.findall('user'):
    for l in Zip(app.iter('login')):
        print("%s" % (app.get('login')));
~
3
Ravi

Linux OSを使用している場合-シンプル xmlstarlet ソリューション:

xmlstarlet sel -t -v "//user/login" -n users.xml
6
RomanPerekhrest

私はあなたのXMLが同様の方法でフォーマットされていると仮定することができます

<users>
    <user>
    <login>pelech 1</login>
    <password>passwords are saved outside</password>
</user>
<user>
    <login>pelech 2</login>
    <password>passwords are saved outside</password>
</user>

最初にログインタグを見つける必要があります。次に、ループ内で反復するタグのテキストを取得する必要があります。

import xml.etree.ElementTree as ET

tree = ET.parse("users.xml")
root = tree.getroot()
for app in root.findall('user'):
    for l in app.findall('login'):
       print("%s" % (l.text));

例としてこのXMLを使用すると、これは私にとってはうまく機能します。

4
user2473494

私はこれを達成するために美しいスープを使用します

Pipを使用してインストールする場合は、次の手順に従ってください

_pip install bs4
_

pythonインタラクティブシェルでテストできます

_>>> from bs4 import BeautifulSoup as Soup
>>> content = """<user>
...     <login>pelech</login>
...     <password>passwords are saved outside</password>
... </user>"""
>>> soup = Soup(content, "html.parser")
>>> soup.find_all("login")
[<login>pelech</login>]
>>> soup.find("login").text
'pelech'
_

デフォルトのhtml.parserを使用しています。正しく解析できない場合は、代わりにlxmlの使用を検討してください。

完全を期すために、soup.find_all("login")から返されたリストを繰り返し処理することができます

_>>> for login in soup.find_all("login"):
...   print(login.text)
... 
pelech
_

または、Pythonの方法

_>>> usernames = [login.text for login in soup.find_all("login")]
>>> usernames
['pelech']
_

詳細については https://www.crummy.com/software/BeautifulSoup/bs4/doc/ を参照してください

3
Sian Lerk Lau

別の行のタグ内のログイン名を使用してファイルがこの形式であることが保証されている場合は、xmlライブラリは不要であり、簡単に行うことができます

sed -n 's_ *</*login>__gp' your.xml

これにより、その行からタグと先頭のスペースが削除され、残り(ユーザー名!)が出力されますが、他のすべての行は-nオプションによって抑制されます。

1
Philippos

lxmlモジュールを使用する

<user>
    <login>pelech</login>
    <password>passwords are saved outside</password>
</user>

次のコードは、xmlからpelechを抽出します

from lxml import etree

document = etree.parse(open("users.xml"))
user = etree.xpath("//login")[0].text    #user will have value pelech

xpath および lxml の詳細

0
vishal