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