Analysieren Sie alle Elementelemente mit Kindern aus dem RSS-Feed mit beautifulsoup

  • Wie erhält man aus einem RSS-Feed eine Folge von allem, was sich in jedem item -Tag befindet?

    Beispieleingabe (vereinfacht):

     <?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
    <channel>
    <title>Test</title>
    <item>
      <title>Hello world1</title>
      <comments>Hi there</comments>
      <pubDate>Tue, 21 Nov 2011 20:10:10 +0000</pubDate>
    </item>
    <item>
      <title>Hello world2</title>
      <comments>Good afternoon</comments>
      <pubDate>Tue, 22 Nov 2011 20:10:10 +0000</pubDate>
    </item>
    <item>
      <title>Hello world3</title>
      <comments>blue paint</comments>
      <pubDate>Tue, 23 Nov 2011 20:10:10 +0000</pubDate>
    </item>
    </channel>
    </rss>
     

    Ich brauche eine Python-Funktion, die diese RSS-Datei übernimmt (ich verwende jetzt beautifulsoup ) und hat eine Schleife, die jeden Gegenstand durchläuft. Ich brauche eine Variable, die aus jedem Element eine Zeichenfolge enthält.

    Beispiel für das erste Schleifenergebnis:

     <title>Hello world1</title>
    <comments>Hi there</comments>
    <pubDate>Tue, 21 Nov 2011 20:10:10 +0000</pubDate>
     

    Dieser Code liefert mir das erste Ergebnis, aber wie bekomme ich die nächsten?

     [pre> html_data = BeautifulSoup(xml)
    print html_data.channel.item
     
    22 November 2011
    deepwell
1 answer
  • Da dies XML ist, verwenden Sie BeautifulStoneSoup :

     import BeautifulSoup
    doc = BeautifulSoup.BeautifulStoneSoup(xml)
    for item in doc.findAll('item'):
        for elt in item:
            if isinstance(elt,BeautifulSoup.Tag):
                print(elt)
     

    Und so können Sie dasselbe mit lxml (was aus irgendeinem Grund viel einfacher zu verwenden ist):

     import lxml.etree as ET
    doc = ET.fromstring(xml)
    for item in doc.xpath('//item'):
        for elt in item.xpath('descendant::*'):
            print(ET.tostring(elt))
     
    22 November 2011
    unutbuSammi De Guzman