1. ホーム
  2. パイソン

[解決済み] beautifulsoupにchildrenタグが存在するかどうかをテストする

2022-03-03 20:20:47

質問

私は、定義された構造を持つXMLファイルを持っていますが、タグの数は次のように異なっています。

ファイル1.xml。

<document>
  <subDoc>
    <id>1</id>
    <myId>1</myId>
  </subDoc>
</document>

ファイル2.xmlを作成します。

<document>
  <subDoc>
    <id>2</id>
  </subDoc>
</document>

ここで、私がチェックしたいのは、もし myId を終了します。そこで、次のようにしました。

data = open("file1.xml",'r').read()
xml = BeautifulSoup(data)

hasAttrBs = xml.document.subdoc.has_attr('myID')
hasAttrPy = hasattr(xml.document.subdoc,'myID')
hasType = type(xml.document.subdoc.myid)

結果は file1.xmlになります。

hasAttrBs -> False
hasAttrPy -> True
hasType ->   <class 'bs4.element.Tag'>

ファイル2.xmlを作成します。

hasAttrBs -> False
hasAttrPy -> True
hasType -> <type 'NoneType'>

よし <myId> の属性ではありません。 <subdoc> .

しかし、サブタグが存在するかどうかをテストするにはどうすればよいのでしょうか?

//編集部:ところで。 私は、サブドキュメント全体を繰り返し処理するのはあまり好きではありません。なぜなら、それは非常に時間がかかるからです。私は、その要素に直接対処したり質問したりできる方法を見つけたいと思っています。

解決方法は?

子タグが存在するかどうかを確認する最も簡単な方法は、単純に

childTag = xml.find('childTag')
if childTag:
    # do stuff


より具体的にOPの質問へ

XMLドキュメントの構造がわからない場合は .find() スープのメソッドです。こんな感じかな。

with open("file1.xml",'r') as data, open("file2.xml",'r') as data2:
    xml = BeautifulSoup(data.read())
    xml2 = BeautifulSoup(data2.read())

    hasAttrBs = xml.find("myId")
    hasAttrBs2 = xml2.find("myId")

構造がわかっている場合は、次のようにタグ名を属性としてアクセスすることで、目的の要素を取得することができます。 xml.document.subdoc.myid . ということで、全体としてはこんな感じでしょうか。

with open("file1.xml",'r') as data, open("file2.xml",'r') as data2:
    xml = BeautifulSoup(data.read())
    xml2 = BeautifulSoup(data2.read())

    hasAttrBs = xml.document.subdoc.myid
    hasAttrBs2 = xml2.document.subdoc.myid
    print hasAttrBs
    print hasAttrBs2

プリント

<myid>1</myid>
None