| 2456 | # http://www.feedparser.org/ |
| 2457 | |
| 2458 | class Newsfeed(SearchEngine): |
| 2459 | |
| 2460 | def __init__(self, license=None, throttle=1.0, language=None): |
| 2461 | SearchEngine.__init__(self, license, throttle, language) |
| 2462 | |
| 2463 | def search(self, query, type=NEWS, start=1, count=10, sort=LATEST, size=SMALL, cached=True, **kwargs): |
| 2464 | """ Returns a list of results from the given RSS or Atom newsfeed URL. |
| 2465 | """ |
| 2466 | if type != NEWS: |
| 2467 | raise SearchEngineTypeError |
| 2468 | if not query or start < 1 or count < 1: |
| 2469 | return Results(query, query, NEWS) |
| 2470 | # 1) Construct request URL. |
| 2471 | # 2) Parse RSS/Atom response. |
| 2472 | kwargs.setdefault("unicode", True) |
| 2473 | kwargs.setdefault("throttle", self.throttle) |
| 2474 | tags = kwargs.pop("tags", []) |
| 2475 | data = URL(query).download(cached=cached, **kwargs) |
| 2476 | data = feedparser.parse(bytestring(data)) |
| 2477 | results = Results(query, query, NEWS) |
| 2478 | results.total = None |
| 2479 | for x in data["entries"][:count]: |
| 2480 | s = "\n\n".join([v.get("value") for v in x.get("content", [])]) or x.get("summary") |
| 2481 | r = Result(url=None) |
| 2482 | r.id = self.format(x.get("id")) |
| 2483 | r.url = self.format(x.get("link")) |
| 2484 | r.title = self.format(x.get("title")) |
| 2485 | r.text = self.format(s) |
| 2486 | r.date = self.format(x.get("updated")) |
| 2487 | r.author = self.format(x.get("author")) |
| 2488 | r.language = self.format(x.get("content") and \ |
| 2489 | x.get("content")[0].get("language") or \ |
| 2490 | data.get("language")) |
| 2491 | for tag in tags: |
| 2492 | # Parse custom tags. |
| 2493 | # Newsfeed.search(tags=["dc:identifier"]) => Result.dc_identifier. |
| 2494 | tag = tag.replace(":", "_") |
| 2495 | r[tag] = self.format(x.get(tag)) |
| 2496 | results.append(r) |
| 2497 | return results |
| 2498 | |
| 2499 | feeds = { |
| 2500 | "Nature": "http://feeds.nature.com/nature/rss/current", |
no outgoing calls
no test coverage detected
searching dependent graphs…