I'm missing something and its driving me bananas,. For some reason, the lookup to the aliases list of dicts is not working.
import urllib.parse
def parse_source_from_url(url):
# Clean up the url
parse_url = urllib.parse.urlparse(url.strip().replace('\n', ''))
# Parse the interesting parts
url = parse_url.netloc.split('.')
# Words to omit
keywords = ['feeds', 'com']
# Determine which url words are not keywords to omit
feed_source = [u for u in url if u not in keywords][0]
# Map out aliases as needed
aliases = [
{'feed_source': 'example', 'alias': 'good'},
{'feed_source': 'feedburner', 'alias': 'notgood'}]
# Select alias if feed_source is shown in list of dict
# This is where the problem is
feed_source = [
a['alias']
if a['feed_source'] == feed_source
else feed_source
for a in aliases]
# Return only the aliased name
return feed_source[0]
urls = ['https://feeds.example.com/', 'https://feeds.feedburner.com/']
for u in urls:
test = parse_source_from_url(u)
print(test)
Results:
- The first result is correct ("example" aliased "good") but the second URL is incorrect.
- "feedburner" should be aliased as "notgood"
good
feedburner
Tried:
- The method here using
next()and theget()methods. - Same issue
CodePudding user response:
You kinda miss the if placement in your loop. Now your feed_source list contains as much records as aliases list. And all of them are equal feed_source except eventually the one that has alias, but you takes first of it anyway.
Correct code should be:
aliased = [a["alias"] for a in aliases if a["feed_source"] == feed_source]
return aliased[0] if aliased else feed_source
So aliased has maximum one element now. If it, it's alias, if not (so aliased is empty) you just return feed_source
And one hint - if your aliases element always have two keys, maybe you could just use dict:
aliases = {'example': 'good', 'feedburner': 'notgood'}
