やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PythonでRSSを取得する(feedparser)

 ためしにやってみた。

成果物

情報源

手順

インストール

pip3 install feedparser
Collecting feedparser
  Using cached https://www.piwheels.org/simple/feedparser/feedparser-5.2.1-py3-none-any.whl
Installing collected packages: feedparser
Successfully installed feedparser-5.2.1

メタデータ表示

show_info.py

import feedparser
print(feedparser.__version__)
print(feedparser.__file__)
print(dir(feedparser))
python3 get_feed.py
5.2.1
/home/pi/.local/lib/python3.5/site-packages/feedparser.py
['ACCEPTABLE_URI_SCHEMES', 'ACCEPT_HEADER', 'CharacterEncodingOverride', 'CharacterEncodingUnknown', 'EBCDIC_MARKER', 'FeedParserDict', 'NonXMLContentType', 'PREFERRED_XML_PARSERS', 'RESOLVE_RELATIVE_URIS', 'RE_DOCTYPE_PATTERN', 'RE_ENTITY_PATTERN', 'RE_SAFE_ENTITY_PATTERN', 'RE_XML_DECLARATION', 'RE_XML_PI_ENCODING', 'SANITIZE_HTML', 'SUPPORTED_VERSIONS', 'ThingsNobodyCaresAboutButMe', 'USER_AGENT', 'UTF16BE_MARKER', 'UTF16LE_MARKER', 'UTF32BE_MARKER', 'UTF32LE_MARKER', 'UndeclaredNamespace', 'ZERO_BYTES', '_BaseHTMLProcessor', '_FeedParserMixin', '_FeedURLHandler', '_HTMLSanitizer', '_LooseFeedParser', '_RelativeURIResolver', '_SGML_AVAILABLE', '_StrictFeedParser', '_StringIO', '_XML_AVAILABLE', '__author__', '__builtins__', '__cached__', '__contributors__', '__doc__', '__file__', '__license__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_base64decode', '_build_urllib2_request', '_convert_to_idn', '_cp1252', '_date_handlers', '_gen_georss_coords', '_geogCS', '_greek_date_format_re', '_greek_months', '_greek_wdays', '_hungarian_date_format_re', '_hungarian_months', '_iso8601_matches', '_iso8601_re', '_iso8601_tmpl', '_korean_am', '_korean_day', '_korean_month', '_korean_nate_date_re', '_korean_onblog_date_re', '_korean_pm', '_korean_year', '_l2bytes', '_makeSafeAbsoluteURI', '_maketrans', '_months', '_open_resource', '_parse_date', '_parse_date_asctime', '_parse_date_greek', '_parse_date_hungarian', '_parse_date_iso8601', '_parse_date_nate', '_parse_date_onblog', '_parse_date_perforce', '_parse_date_rfc822', '_parse_date_w3dtf', '_parse_georss_box', '_parse_georss_line', '_parse_georss_point', '_parse_georss_polygon', '_parse_poslist', '_parse_psc_chapter_start', '_resolveRelativeURIs', '_s2bytes', '_sanitizeHTML', '_urifixer', '_urljoin', '_xmlescape', 'base64', 'binascii', 'cgi', 'chardet', 'codecs', 'codepoint2name', 'collections', 'convert_to_utf8', 'copy', 'datetime', 'entitydefs', 'gzip', 'itertools', 'name2codepoint', 'parse', 're', 'registerDateHandler', 'replace_doctype', 'rfc822', 'sgmllib', 'struct', 'time', 'timezonenames', 'types', 'urllib', 'warnings', 'xml', 'zlib']

コード

 任意RSSから項目を取得する。

import feedparser
import datetime
import sys

if len(sys.argv) < 2:
    raise Error('第1引数にRSSのURLを指定してください。')
    exit()
rss = sys.argv[1]
entries = feedparser.parse(rss).entries
print(len(entries))
for entry in entries:
    print(datetime.datetime
        .strptime(entry.published, '%a, %d %b %Y %H:%M:%S %z')
        .strftime('%Y-%m-%dT%H:%M:%SZ%z'))
    print(entry.link)
    print(entry.title)
    if 'content' in entry : print(entry.content)
    print()

 公開日時、URL、タイトルが取得できた。本文はとれなかった。そもそもRSSに無かった。

Python日付を自動判別してくれず

 様々な書式から自動的に日付型にしてほしい。これ、RSS元がテキストデータだし、書式も自由だから大変なことになりそう。サイトごとにフォーマット変えなきゃダメじゃんか……。変わったら対応しなきゃダメじゃんか……。ないわ。

日付の形式

Thu, 19 Sep 2019 12:53:49 +0900
曜日3, 日, 月3 年 時分秒 タイムゾーン
%a, %d %b %Y %H:%M:%S %z

 ISO-8601YYYY-mm-ddTHH:MM:SSZに統一してほしい。

RSSによっては存在する項目としない項目がある

 この対応も面倒。サイトごとに変えなければならない。いちいち以下のようなif文が必要とか。ないわ。

if 'キー名' in entry : print(entry.キー名)

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux