web-dev-qa-db-ja.com

子タグがbeautifulsoupに存在するかどうかをテストします

定義された構造を持つXMLファイルがありますが、タグの数は異なります。

file1.xml:

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

file2.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'>

file2.xml:

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

さて、<myId><subdoc>の属性ではありません。

しかし、サブタグが存在する場合、どのようにテストできますか?

//編集:ちなみに、サブドック全体を繰り返し処理するのはあまり好きではありません。私は、その要素に住所を向ける/尋ねる方法を見つけたいと思っています。

13
The Bndr

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
4
wpercy
if tag.find('child_tag_name'):
20
ahuigo

Instagram URLにh2タグが存在するかどうかを確認する例を次に示します。お役に立てば幸いです。

import datetime
import urllib
import requests
from bs4 import BeautifulSoup

instagram_url = 'https://www.instagram.com/p/BHijrYFgX2v/?taken-by=findingmero'
html_source = requests.get(instagram_url).text
soup = BeautifulSoup(html_source, "lxml")

if not soup.find('h2'):
    print("didn't find h2")
2
Mona Jalal

次のように処理できます。

for child in xml.document.subdoc.children:
    if 'myId' == child.name:
       return True
1
chyoo CHENG