2015-10-20 23 views
6

Ho un file XML con una struttura definita, ma diverso numero di tag, comeprova se tag bambini esiste in BeautifulSoup

file1.xml:

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

file2.xml:

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

Ora mi piace controllare, se il tag myId esce. Così ho fatto la seguente:

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) 

Il risultato è per file1.xml:

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

file2.xml:

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

Okay, <myId> non è un attributo di <subdoc>.

Ma come posso testare, se esiste un tag secondario?

// Modifica: A proposito: non mi piace molto iterare attraverso l'intero subdoc, perché sarà molto lento. Spero di trovare un modo in cui posso indirizzare l'indirizzo/chiedere quell'elemento.

risposta

2

È possibile ottenere questo accedendo al nome del tag come un attributo come questo xml.document.subdoc.myid. Quindi il tutto sarebbe andato qualcosa come questo:

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 

Stampe

<myid>1</myid> 
None 
+1

... ma 'find()' ricerca attraverso il documento, giusto? Ma, conosco la posizione del tag insight l'albero xml (se esiste). Quindi non esiste un modo semplice per indirizzare direttamente un elemento o controllare se quell'elemento esiste? –

+0

Oh ok, mi dispiace di aver frainteso la prima volta. Ho aggiornato la mia risposta. – wpercy

+0

Oh, capisco ... "Mantenerlo semplice" a volte è il modo migliore. Grazie per aprire gli occhi ... –

1

si può gestire in questo modo:

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

Grazie. Ma: Il pensiero è che non mi piace davvero iterare attraverso l'intero subdoc, perché questi sono documenti di grandi dimensioni e devo percorrere migliaia di file xml. Spero di trovare un modo in cui posso indirizzare l'indirizzo/chiedere quell'elemento. –

9
if tag.find('child_tag_name'): 
1

Ecco un esempio per controllare se tag h2 esiste in un URL Instagram. Spero che lo trovi utile:

1 import datetime 
    2 import urllib 
    3 import requests 
    4 from bs4 import BeautifulSoup 
11 instagram_url = 'https://www.instagram.com/p/BHijrYFgX2v/?taken-by=findingmero' 
12 html_source = requests.get(instagram_url).text 
13 soup = BeautifulSoup(html_source, "lxml") 
14 if not soup.find('h2'): 
15   print("didn't find h2") 
+0

Questa riga qui "se non soup.find ('h2'):" mi ha appena risparmiato un sacco di mal di testa. Non lo sapevo. Grazie! – M4cJunk13