Разобрать все элементы элемента с детьми из ленты RSS с beautifulsoup - PullRequest
1 голос
/ 22 ноября 2011

Из RSS-канала, как получить строку всего, что находится внутри каждого тега item ?

Пример ввода (упрощенно):

<?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>

Мне нужна функция python, которая принимает этот RSS-файл (сейчас я использую Beautifulsoup) и имеет цикл, который проходит через каждый элемент. Мне нужна переменная, которая содержит строку всего внутри каждого элемента .

Пример первого результата цикла:

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

Этот код дает мне первый результат, но как мне получить все следующие?

html_data = BeautifulSoup(xml)
print html_data.channel.item

1 Ответ

3 голосов
/ 22 ноября 2011

Поскольку это XML, используйте BeautifulStoneSoup :

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

И вот как вы можете сделать то же самое с lxml , (что по какой-то причине янайти гораздо проще в использовании):

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...