def brewers_by_alpha(self, letter): """Returns a list of breweries that start with the provided letter. Args: letter (string): a single letter to search. Returns: A list of breweries. Each entry contains a name and a reference so you can look it up with the ``brewery`` method. """ if letter not in string.ascii_uppercase and letter != '0-9': raise ValueError("Please only provide a single letter.") request = requests.post(soup_helper._BASE_URL + "/browsebrewers-" + letter + ".htm") soup = BeautifulSoup(request.text, "lxml") breweries = [] for entry in soup.select('a[href*=/brewers/]'): url = entry.get('href') brewer = models.Brewery(url) breweries.append(brewer) return breweries
def search(self, query): """Returns a list of beers and breweries that matched the search query. Args: query (string): The text of the search. Returns: A dictionary containing two lists, ``breweries`` and ``beers``. Each list contains a dictionary of attributes of that brewery or beer. """ try: query = unicode(query, 'UTF8').encode('iso-8859-1') except (TypeError, NameError): # Python 3 does not have unicode() query = query.encode('iso-8859-1') request = requests.post( soup_helper._BASE_URL + "/findbeer.asp", data={"BeerName": query} ) soup = BeautifulSoup(request.text, "lxml") output = {"breweries": [], "beers": []} # Locate rows that contain the brewery and beer info beer_table = soup.find('h2', string='beers') if beer_table: for row in beer_table.next_sibling('tr'): # Only include ratable beers if row.find(title='Rate This Beer'): url = row('td')[0].a.get('href') url = re.sub(r"\s+", "", url, flags=re.UNICODE) beer = models.Beer(url) beer.name = row('td')[0].a.string.strip() overall_rating = row('td')[3].string num_ratings = row('td')[4].string if overall_rating: beer.overall_rating = int(overall_rating.strip()) if num_ratings: beer.num_ratings = int(num_ratings.strip()) output['beers'].append(beer) brewer_table = soup.find('h2', string='brewers') if brewer_table: for row in brewer_table.next_sibling('tr'): url = row.a.get('href') url = re.sub(r"\s+", "", url, flags=re.UNICODE) brewer = models.Brewery(url) brewer.name = row.a.string brewer.location = row('td')[1].string.strip() output['breweries'].append(brewer) return output
def get_brewery(self, url, fetch=None): """Returns a Brewery object for the requested URL""" if fetch is None: fetch = False return models.Brewery(url, fetch)