def get_standalone_info(game, name, document): # middle left column game_left_column = domparser.get_element( document, 'div', class_='leftcol game_description_column') purchase_block = domparser.get_element(game_left_column, 'div', id='game_area_purchase') game.store.category = get_game_category(purchase_block, document) game.store.price = get_game_price(purchase_block, name) game.store.os = get_game_os(game_left_column) # top right header glance_ctn_block = domparser.get_element(document, 'div', class_='glance_ctn') game.store.image = get_game_image(glance_ctn_block) game.store.avg_review,\ game.store.cnt_review = get_game_review(glance_ctn_block, name) game.store.release_date = get_game_release_date(glance_ctn_block, name) game.store.tags = get_game_tags(glance_ctn_block) if (game.store.category in [Category.Game, Category.Video]): game.store.description = get_game_description(glance_ctn_block) elif (game.store.category is Category.DLC): game.store.description = get_dlc_description(document) else: game.store.description = '' styledprint.print_info( 'The category {0} is not implemented yet!'.format( game.store.category.name)) game.store.interface,\ game.store.audio,\ game.store.subtitles = get_game_languages(document)
def get_game_languages(document): interface = list() audio = list() subtitles = list() try: language_block = domparser.get_element(document, 'table', class_='game_language_options') if (language_block is not None): rows = domparser.get_elements(language_block, 'tr') if (rows): for row in rows[1:]: language = domparser.get_text(row, 'td', class_='ellipsis').strip() availabilities = domparser.get_elements(row, 'td', class_='checkcol') if (availabilities): if (domparser.get_element(availabilities[0], 'span') is not None): interface.append(language) if (domparser.get_element(availabilities[1], 'span') is not None): audio.append(language) if (domparser.get_element(availabilities[2], 'span') is not None): subtitles.append(language) except Exception as e: titles = get_titles(document, 'N/A') print(titles) raise e return interface, audio, subtitles
def get_game_category(purchase_block, document): dlc_block = domparser.get_element( purchase_block, 'div', class_='game_area_dlc_bubble game_area_bubble') if (dlc_block is not None): return Category.DLC videos_href = domparser.get_element(document, 'a', text='All Streaming Videos') if (videos_href is not None): return Category.Video return Category.Game
def get_game_review(glance_ctn_block, name): overall_block = domparser.get_element(glance_ctn_block, 'div', class_='subtitle column all', string='All Reviews:') if (overall_block == None): styledprint.print_info( 'Cannot find the review block for game: {0}'.format(name)) return '', '0' user_reviews_block = domparser.get_parent(overall_block) reviewCount = domparser.get_value(user_reviews_block, 'content', 'meta', itemprop='reviewCount') ratingValue = domparser.get_value(user_reviews_block, 'content', 'meta', itemprop='ratingValue') if (reviewCount): return int(ratingValue), int(reviewCount) return None, None
async def get_forOneRating(url, rating, webSession): fullURL = url + rating apps = [] _, _, page = await webSession.cached_get_web_page(fullURL) if ((page is None) or ('<p class="text-center">No matches found</p>' in page)): return apps document = domparser.load_html(page) pageElem = domparser.get_element(document, 'div', class_='text-center') numOfPages = domparser.get_next_siblings_text(pageElem, 'b')[1] tasks = [] for p in range(2, int(numOfPages) + 1): nextURL = '{0}&iPage={1}'.format(fullURL, p) tasks.append(webSession.cached_get_web_page(nextURL)) #1st page apps.extend(get_apps_from_doc(document)) #others for f in asyncio.as_completed(tasks): _, _, page = await f document = domparser.load_html(page) apps2 = get_apps_from_doc(document) if (apps2 is not None): apps.extend(apps2) print(len(apps), 'apps for rating', rating) return apps, rating
def get_apps_from_doc(document): table = domparser.get_element(document, 'table', class_="whq-table whq-table-full") if (table is None): return None return domparser.get_texts_and_values(table, 'a', 'href')[2:]
def get_game_details(document): details_block = domparser.get_element( document, 'div', class_='block responsive_apppage_details_left', id="category_block") if (details_block is not None): return domparser.get_texts(details_block, 'a') return list()
def get_game_tags(glance_ctn_block): tags_block = domparser.get_element(glance_ctn_block, 'div', class_='glance_tags popular_tags') if (tags_block is not None): # tags are by default in the format: # \r\n\t\t\t\t\t\t\t\t\t\t\t\tTAG\t\t\t\t\t\t\t\t\t\t\t\t return sorted( list(map(lambda s: s.strip(), domparser.get_texts(tags_block, 'a')))) return list()
def get_dlc_description(document): widget_create_block = domparser.get_element(document, 'div', id='widget_create') if (widget_create_block is not None): description = domparser.get_value(widget_create_block, 'placeholder', 'textarea') if (description is not None): return description.replace('"', '').strip() return None
def get_game_genres(document): genre_title = domparser.get_element(document, 'b', string='Genre:') if (genre_title is not None): return domparser.get_next_siblings_text(genre_title, 'a') return list()
def get_game_price(purchase_block, name): wrappers = domparser.get_elements(purchase_block, 'div', class_='game_area_purchase_game_wrapper') if (wrappers is not None): names = list() prices = list() for wrapper in wrappers: names.append(domparser.get_text(wrapper, 'h1')[4:].lower()) price = domparser.get_text(wrapper, 'div', class_='game_purchase_price price') if (not price): price = domparser.get_text(wrapper, 'div', class_='discount_final_price') prices.append(price) sortedprices = list() if (len(names)): matches = namematching.get_matches(name.lower(), names, len(names)) for match in matches: index = names.index(match) sortedprices.append(prices[index]) if (not len(sortedprices)): sortedprices = prices else: sortedprices = domparser.get_texts(purchase_block, 'div', class_='game_purchase_price price') if (not sortedprices): sortedprices = domparser.get_texts(purchase_block, 'div', class_='discount_final_price') for price in sortedprices: if (price): # we got the wrong div if ('demo' in price.lower()): continue price = price.replace('$', '').replace('€', '').strip() if (price.replace('.', '', 1).isdigit()): return float(price) elif (('free' in price.lower()) or ('play' in price.lower())): return 0 else: styledprint.print_info('Unexpected price: {0} for {1}'.format( price, name)) return -1 play_game_span = domparser.get_element(purchase_block, 'span', string='Play Game') if (play_game_span is not None): return 0 download_span = domparser.get_element(purchase_block, 'span', string='Download') if (download_span is not None): return 0 styledprint.print_info('No price found for {0}'.format(name)) return -1
async def get_collection_info(game, name, document, webSession): game.store.category = Category.Collection descriptions = list() OS = list() release_dates = list() avg_reviews = 0 cnt_reviews = 0 tags = list() interface = list() audio = list() subtitles = list() game_left_column = domparser.get_element( document, 'div', class_='leftcol game_description_column') items = domparser.get_elements(game_left_column, 'div', class_='tab_item ') if (len(items) == 0): items = domparser.get_elements(game_left_column, 'div', class_='tab_item') for item in items: itemlink = domparser.get_value(item, 'href', 'a', class_='tab_item_overlay') itemname = domparser.get_text(item, 'div', class_='tab_item_name') descriptions.append('- {0}'.format(itemname)) itemgame = Game() itemgame.store.link = itemlink await get_store_info(itemgame, itemname, webSession) for o in itemgame.store.os: if (o not in OS): OS.append(o) if (itemgame.store.release_date): release_dates.append(itemgame.store.release_date) # to average the reviews if (itemgame.store.cnt_review): avg_reviews += itemgame.store.cnt_review * itemgame.store.avg_review cnt_reviews += itemgame.store.cnt_review for tag in itemgame.store.tags: if (tag not in tags): tags.append(tag) for language in itemgame.store.interface: if (language not in interface): interface.append(language) for language in itemgame.store.audio: if (language not in audio): audio.append(language) for language in itemgame.store.subtitles: if (language not in subtitles): subtitles.append(language) game.store.image = get_collection_image(game_left_column) game.store.description = 'Items included in this package:{0}{1}'.format( os.linesep, os.linesep.join(descriptions)) game.store.os = sorted(OS) if (len(release_dates)): game.store.release_date = sorted(release_dates)[-1] if (cnt_reviews): game.store.avg_review = int(avg_reviews / cnt_reviews) game.store.cnt_review = int(cnt_reviews / len(items)) game.store.tags = sorted(tags) game.store.interface = sorted(interface) game.store.audio = sorted(audio) game.store.subtitles = sorted(subtitles) purchase_block = domparser.get_element(game_left_column, 'div', id='game_area_purchase') game.store.price = get_game_price(purchase_block, name)
def get_post(url, postid): status, html = web.get_utf8_web_page(url) document = domparser.load_html(html) post = domparser.get_element(document, 'div', id=postid) return str(post)