diff --git a/pysychonaut/__init__.py b/pysychonaut/__init__.py index 7fffbeb..951bc45 100644 --- a/pysychonaut/__init__.py +++ b/pysychonaut/__init__.py @@ -56,7 +56,7 @@ class Erowid(object): begin_delimiter = '' begin = text.index(begin_delimiter) + len(begin_delimiter) end = text.index('') - return text[begin:end].strip().replace("
", "\n").replace("
", "\n").replace("\n\n", " ") + return text[begin:end].strip().replace("
", "\n").replace("
", "\n").replace("\n\n", " ").replace("
", "\n") except ValueError: return '' @@ -90,7 +90,7 @@ class Erowid(object): soup = BeautifulSoup(response, "lxml") drug = soup.find('div', {'class': 'substance'}).getText().strip().lower().replace("/", ", ") experience_data = soup.find('table', {'class': 'footdata'}).getText().strip().lower().split("\n") - data["drug"] = drug + data["substance"] = drug data["experience"] = experience data["year"] = experience_data[0].split("expid:")[0].replace("exp year: ", "").strip() data["gender"] = experience_data[1].replace("gender: ", "").strip() @@ -285,33 +285,44 @@ class PsychonautWiki(object): self.substance_list = self.get_substance_list() self.substances = self.get_substance_data() - def fix_substance_names(self, sentence): + def extract_substance_name(self, sentence): + + words = sentence.lower().split(" ") + found = False # check for drug slang names for substance in self.drug_slang: + substance = substance.lower() name = self.drug_slang[substance].strip() - if substance.lower() in sentence.split(" "): - return sentence.replace(substance.lower(), name) + for idx, word in enumerate(words): + if substance == word: + found = name + break # check substance list for substance in self.substance_list: - if substance.lower() in sentence.split(" "): - return sentence.replace(substance.lower(), substance) + substance = substance.lower() + for idx, word in enumerate(words): + if substance == word: + found = substance + break - # probably not talking about drugs - return False + if found: + # match case, psychonaut wiki doesn't like lower-case + subs = self.substance_list + substances = [s.lower() for s in subs] + substance = found.lower() + if substance in substances: + found = subs[substances.index(substance)] + + return found def search_psychonaut_wiki(self, substance): - s = self.fix_substance_names(substance) + s = self.extract_substance_name(substance) if not s: print "Warning, this query does not seem to contain a valid substance name" else: substance = s - # match case, psychonaut wiki doesn't like lower-case - subs = self.substance_list - substances = [s.lower() for s in subs] - substance = substance.lower() - if substance in substances: - substance = subs[substances.index(substance)] + url = "https://api.psychonautwiki.org/?query=%7B%0A%20%20%20%20substances(query%3A%20%22" + substance + "%22)%20%7B%0A%20%20%20%20%20%20%20%20name%0A%0A%20%20%20%20%20%20%20%20%23%20routes%20of%20administration%0A%20%20%20%20%20%20%20%20roas%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20dose%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20units%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20threshold%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heavy%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20common%20%7B%20min%20max%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20light%20%7B%20min%20max%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20strong%20%7B%20min%20max%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20duration%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20afterglow%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comeup%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20duration%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20offset%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20onset%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20peak%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20total%20%7B%20min%20max%20units%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20bioavailability%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min%20max%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%23%20subjective%20effects%0A%20%20%20%20%20%20%20%20effects%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%20url%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D" return json.loads(requests.get(url).text)["data"] @@ -428,19 +439,29 @@ class AskTheCaterpillar(object): def fix_substance_names(self, sentence): - # check for drug slanslangg names + words = sentence.lower().split(" ") + found = False + # check for drug slang names for substance in self.drug_slang: + substance = substance.lower() name = self.drug_slang[substance].strip() - if substance.lower() in sentence.split(" "): - return sentence.replace(substance.lower(), name) + for idx, word in enumerate(words): + if substance == word: + words[idx] = name + found = True # check substance list for substance in self.substance_list: - if substance.lower() in sentence.split(" "): - return sentence.replace(substance.lower(), substance) + substance = substance.lower() + for idx, word in enumerate(words): + if substance == word: + words[idx] = substance + found = True + if found: + return " ".join(words) # probably not talking about drugs - return False + return found @staticmethod def ask_the_caterpillar(query): diff --git a/setup.py b/setup.py index 6feca9b..9804a5a 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name='PySychonaut', - version='0.3.1', + version='0.4', packages=['pysychonaut'], url='https://github.com/JarbasAl/PySychonaut', license='MIT',