Анализ XML BeautifulSoup — возвращает только первый результат

#python #beautifulsoup #xml-parsing

#python #beautifulsoup #синтаксический анализ xml

Вопрос:

Я пытаюсь проанализировать следующий XML-файл с помощью BeautifulSoup. Однако возвращается только первый результат.

Учитывая следующий XML:

 <?xml version="1.0"?>
<TransXChange>
    <StopPoints>     
        <AnnotatedStopPointRef>         
            <StopPointRef>StopPointRefOne</StopPointRef>
            <CommonName>CommonNameOne</CommonName>
            <Indicator>IndicatorOne</Indicator>
            <LocalityName>LocalityNameOne</LocalityName>
            <LocalityQualifier>LocalityQualifierOne</LocalityQualifier>
        </AnnotatedStopPointRef>
        <AnnotatedStopPointRef>  
            <StopPointRef>StopPointRefTwo</StopPointRef>
            <CommonName>CommonNameTwo</CommonName>
            <Indicator>IndicatorTwo</Indicator>
            <LocalityName>LocalityNameTwo</LocalityName>
            <LocalityQualifier>LocalityQualifierTwo</LocalityQualifier>
        </AnnotatedStopPointRef>
        <AnnotatedStopPointRef>          
            <StopPointRef>StopPointRefThree</StopPointRef>
            <CommonName>CommonNameThree</CommonName>
            <Indicator>IndicatorThree</Indicator>
            <LocalityName>LocalityNameThree</LocalityName>
            <LocalityQualifier>LocalityQualifierThree</LocalityQualifier>
        </AnnotatedStopPointRef>
  

И следующий скрипт на Python:

 from bs4 import BeautifulSoup as bs

inputFile = open("sample.xml","r")

contents = inputFile.read()

soup = bs(contents, 'xml')

StopPoints = soup.find_all('StopPoints')

for annotatedStopPointRef in StopPoints:
    print(annotatedStopPointRef.StopPointRef.string)
  

Я получаю только следующий результат:
StopPointRefOne

Где я ожидал бы: StopPointRefOneStopPointRefTwoStopPointRefThree

Ответ №1:

В вашем скрипте вы ищете только 'StopPoints' , который есть только один. Таким образом, цикл будет повторяться только один раз. Вам также необходимо выполнить поиск 'AnnotatedStopPointRef' внутри цикла:

 soup = bs(contents, 'xml')

StopPoints = soup.find_all('StopPoints')

for sp in StopPoints:
    for annotatedStopPointRef in sp.find_all('AnnotatedStopPointRef'):
        print(annotatedStopPointRef.StopPointRef.string)
  

С принтами:

 StopPointRefOne
StopPointRefTwo
StopPointRefThree