2015-03-04 1 views
0

Например, чтобы читать RSS-канал, это не работает из-за глупые {http://purl.org ...} пространств имен, которые вставляются перед «пунктом»:Как перемещаться по дереву XML, не беспокоясь о префиксах пространства имен в Python?

#!/usr/bin/env python3 
import xml.etree.ElementTree as ET 
import urllib, urllib.request 

url = "http://some/rss/feed" 
response = urllib.request.urlopen(url) 
xml_text = response.read().decode('utf-8') 
xml_root = ET.fromstring(xml_text) 
for e in xml_root.findall('item'): 
    print("I found an item!") 

Теперь, когда FindAll() было вынесено бесполезно из-за {} префиксов, вот еще одно решение, но это некрасиво:

#!/usr/bin/env python3 
import xml.etree.ElementTree as ET 
import urllib, urllib.request 

url = "http://some/rss/feed" 
response = urllib.request.urlopen(url) 
xml_text = response.read().decode('utf-8') 
xml_root = ET.fromstring(xml_text) 
for e in xml_root: 
    if e.tag.endswith('}item'): 
    print("I found an item!") 

Могу ли я получить ElementTree просто мусор всех префиксов?

ответ

1

Вы должны обращаться с пространствами имен, как ясно объяснено на:

Но что, если вместо этого вы будете использовать специализированную библиотеку для чтения RSS-каналы, как feedparser:

>>> import feedparser 
>>> url = "http://some/rss/feed" 
>>> feed = feedparser.parse(url) 

Хотя я бы p в одиночку использовать XMLFeedSpider Scrapy spider. В качестве бонуса вы получите все остальные Scrapy web-scraping framework features.

Смежные вопросы