Проверьте, существует ли дочерний тег в 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>.

Но как я могу протестировать, если существует субтег?

//Edit: Кстати: мне не очень нравится перебирать весь субдоктор, потому что это будет очень медленно. Я надеюсь найти способ, которым я могу направлять адрес/задавать этот элемент.

Ответ 1

Если вы не знаете структуру документа 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 к имени тега как к атрибуту, подобному этому 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

Ответ 2

if tag.find('child_tag_name'):

Ответ 3

вы можете справиться с этим следующим образом:

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

Ответ 4

Вот пример, чтобы проверить, существует ли тег h2 в URL-адресе Instagram. Надеюсь, что вы найдете ее полезной:

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")