rssfeed 0.3__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rssfeed
3
- Version: 0.3
3
+ Version: 0.4.0
4
4
  Summary: A simple rss/atom feed parser
5
5
  Keywords: rssfeed,rss,feed,atom,feedparser
6
6
  Author: p7e4
@@ -27,7 +27,7 @@ classifiers = [
27
27
  "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
28
28
  "Topic :: Text Processing :: Markup :: XML",
29
29
  ]
30
- version = "0.3"
30
+ version = "0.4.0"
31
31
 
32
32
  [project.license]
33
33
  text = "GPLv3"
@@ -0,0 +1,62 @@
1
+ from dateutil.parser import parse as timeParse
2
+ from xml.etree import ElementTree
3
+
4
+ __version__ = "0.4.0"
5
+
6
+ class ParseError(Exception):
7
+ pass
8
+
9
+ def parse(data):
10
+ parser = ElementTree.XMLPullParser(("start", "end"))
11
+ try:
12
+ parser.feed(data)
13
+ parser.close()
14
+ except ElementTree.ParseError as e:
15
+ raise ParseError("xml parse fail") from e
16
+
17
+ items = list()
18
+ lastTag = str()
19
+ for event, elem in parser.read_events():
20
+ tag = elem.tag.split("}", 1)[1] if elem.tag.startswith("{") else elem.tag
21
+ text = elem.text.strip() if elem.text else str()
22
+ if event == "start":
23
+ if tag in ("channel", "RDF", "feed", "item", "entry"):
24
+ items.append({
25
+ "title": str(),
26
+ "author": str(),
27
+ "timestamp": 0,
28
+ "url": str(),
29
+ "content": str()
30
+ })
31
+ else:
32
+ i = items[-1]
33
+ match tag:
34
+ case "content" | "description" | "encoded" | "summary":
35
+ i["content"] = text
36
+ case "updated" | "pubDate" | "published" | "lastBuildDate":
37
+ if text.isdigit():
38
+ i["timestamp"] = int(text)
39
+ elif text:
40
+ try:
41
+ i["timestamp"] = int(timeParse(text).timestamp())
42
+ except Exception as e:
43
+ raise ParseError("time parse fail") from e
44
+ case "link":
45
+ i["url"] = text or elem.get("href")
46
+ case "name" if lastTag == "author":
47
+ i["author"] = text
48
+ case "title":
49
+ i[tag] = text
50
+
51
+ lastTag = tag
52
+
53
+ if not items:
54
+ raise ParseError("not valid result")
55
+
56
+ feed = {
57
+ "name": items[0]["title"],
58
+ "lastupdate": items[0]["timestamp"],
59
+ "items": items[1:]
60
+ }
61
+
62
+ return feed
@@ -1,74 +0,0 @@
1
- from dateutil.parser import parse as timeParse
2
- from xml.etree import ElementTree
3
-
4
- __version__ = "0.3"
5
-
6
- def parse(data):
7
- assert type(data) == str, "data argument must be a string"
8
- if not data or not (data:=data.lstrip()):
9
- return
10
- if not any((data.startswith(i) for i in ("<?xml ", "<rss ", "<feed "))):
11
- return
12
- parser = ElementTree.XMLPullParser(("start", "end"))
13
- try:
14
- parser.feed(data)
15
- parser.close()
16
- except ElementTree.ParseError:
17
- return
18
-
19
- items = list()
20
- path = list()
21
- for event, elem in parser.read_events():
22
- tag = elem.tag.split("}", 1)[1] if elem.tag.startswith("{") else elem.tag
23
- text = elem.text.strip() if elem.text else str()
24
- if event == "start":
25
- if tag in ("channel", "RDF", "feed", "item", "entry"):
26
- items.append({
27
- "title": str(),
28
- "author": str(),
29
- "timestamp": 0,
30
- "url": str(),
31
- "content": str()
32
- })
33
- path.append(tag)
34
- else:
35
- match tag:
36
- case "summary" | "description" | "encoded":
37
- tag = "content"
38
- case "updated" | "pubDate" | "published" | "lastBuildDate":
39
- if text.isdigit():
40
- items[-1]["timestamp"] = int(text)
41
- elif text:
42
- try:
43
- items[-1]["timestamp"] = int(timeParse(text).timestamp())
44
- except:
45
- pass
46
- continue
47
- case "link":
48
- items[-1]["url"] = text or elem.get("href")
49
- continue
50
- case "author":
51
- authorTag = False
52
- continue
53
- case "name" if path[-2] == "author":
54
- tag = "author"
55
- case "title" | "content":
56
- pass
57
- case _:
58
- continue
59
-
60
- items[-1][tag] = text
61
- path.pop()
62
-
63
- if not items: return
64
- feed = {
65
- "name": items[0]["title"],
66
- "lastupdate": items[0]["timestamp"],
67
- "items": items[1:]
68
- }
69
- # for item in items:
70
- # if feed["lastupdate"] < item["timestamp"]:
71
- # feed["lastupdate"] = item["timestamp"]
72
-
73
- return feed
74
-
File without changes
File without changes
File without changes