def test_empty_scalars_return_nullnode(self): node = Soupy('<a></a>').find('a') assert isinstance(node.next_sibling, NullNode) assert isinstance(node.previous_sibling, NullNode) node = Soupy('<a></a>') assert isinstance(node.parent, NullNode)
def test_orelse(self): node = Soupy('<a><b>1</b></a><a>2</a>') result = node.find_all('a').dump( a=Q.find('b').text.map(int).orelse(0)).val() assert result == [{'a': 1}, {'a': 0}]
def test_repr_unicode(self): s = Soupy('<html>∂ƒ</html>') print(s) print(repr(s)) if not PY3: # must be ascii-encodable on py2 assert repr(s).encode('ascii') print(text_type(s))
def test_navstring_dump(self): node = Soupy('<div><a>1</a>2<a>3</a></div>') result = node.find('div').contents.each(Q.text).val() assert result == ['1', '2', '3'] result = (node.find('div').contents.each( Q.contents[0].text.orelse('!')).val()) assert result == ['1', '!', '3']
def test_simple_dump(self): node = Soupy('<a>1</a><a>2</a><a>3</a>') result = node.find_all('a').dump(a=Q.text).val() assert result == [{'a': '1'}, {'a': '2'}, {'a': '3'}] result = node.find_all('a').dump(Q.text).val() assert result == [('1', ), ('2', ), ('3', )] with pytest.raises(ValueError): node.find('a').dump(Q.text, a=Q.text)
def test_find_multi_methods(self, method): node = Soupy(""" <div> <div></div> <b><div></div></b> <div></div> </div> """).find('b') dom = node.val() expected = getattr(dom, method)('div') assert expected actual = getattr(node, method)('div').val() assert actual == expected
def test_multi_dump(self): node = Soupy('<a val="1">1</a><a>2</a><a val="3">3</a>') result = node.find_all('a').dump(a=Q.text, b=Q.attrs.get('val')).val() assert result == [{ 'a': '1', 'b': '1' }, { 'a': '2', 'b': None }, { 'a': '3', 'b': '3' }]
def get_chart(self, chart_name): self.chart_list = [] self.chart_name = chart_name.lower() global KeyError try: number = self.chart_titles_dict[self.chart_name] except KeyError: #return json.dumps(["That chart does not exist"], indent = 2) raise ValueError('That chart does not exist') self.url = self.base_url + str(number) raw = requests.get(self.url) soup = Soupy(raw.text) tr_container = soup.find_all('tr', {'class': 'latc_song'}) global NameError pos = 0 song_title_constant = 2 song_artist_constant = 3 for table_row in tr_container: children = table_row.children null_container_holder = type( children[0].find('table').find_all('a')) for child in children: links = child.find('table').find_all('a') if type(links) is not null_container_holder: try: try: pos = pos + 1 song_title = links[ song_title_constant].contents.first().val( ).string song_artist = links[ song_artist_constant].contents.first().val( ).string self.chart_list.append( (('position', pos), ('title', song_title), ('artist', song_artist))) except NullValueError, NameError: print('\n') except NameError: song_title = links[song_title_constant - 1].contents.first().val().string song_artist = links[song_artist_constant - 1].contents.first().val().string self.chart_list.append( (('position', pos), ('title', song_title), ('artist', song_artist))) return json.dumps(self.chart_list, indent=3)
def check_podcast(type, url): global CHANNEL, videos, bot, apikey page = Soupy(urllib.urlopen(url)) try: namenode = page.find("h2") latestname = namenode.text.val() if not latestname == videos[type]: latestdesc = page.find(class_="deck").text.val().strip() bot.say( CHANNEL, "[New %s] %s - %s %s" % (PODCAST_NAMES[type], latestname, latestdesc, url)) log.info("New %s: %s" % (PODCAST_NAMES[type], latestname)) videos[type] = latestname return True return False except: log.error("Failed checking for latest %s at %s" % (type, url)) return False
def test_find_multi_fail(self, method): node = Soupy('<a class="test">test</a>') result = getattr(node, method)('b') assert len(result) == 0
def test_failed_search(self): node = Soupy('<a><b>1</b></a><a>2</a>') with pytest.raises(NullValueError): node.find_all('a').dump(a=Q.find('b').text)
def test_iter(self): node = Soupy('<a class="test">test</a>') for a, b in zip(node, node.val()): assert a.val() == b
def test_dump_with_multi_map(self): node = Soupy('<a>1</a><a>2</a><a>3</a>') result = node.find_all('a').dump( a=Q.text.map(int).map(lambda x: x * 2)).val() assert result == [{'a': 2}, {'a': 4}, {'a': 6}]
def test_call(self): node = Soupy('<a class="test">test</a>') assert node('a').val() == node.val()('a')
def test_repr_unicode(self): s = Soupy('<html>∂ƒ</html>') print(s) print(repr(s)) print(text_type(s))
def test_either_fallback(self): node = Soupy('<a><b>1</b></a><a>2</a>') assert isinstance( node.apply(either(Q.find('d').text, Q.find('d').text)), Null)
def test_simple_dump(self): node = Soupy('<a>1</a><a>2</a><a>3</a>') result = node.find_all('a').dump(a=Q.text).val() assert result == [{'a': '1'}, {'a': '2'}, {'a': '3'}]
def test_collection_properties(self, attr): node = Soupy('<a class="foo"><b><c>test</c></b></a>').find('b') dom = node.val() assert list(getattr(node, attr).val()) == list(getattr(dom, attr))
def test_repr_unicode(self): s = Collection([Soupy('<html>∂ƒ</html>')]) print(s) print(repr(s)) print(text_type(s))
def setup_method(self, method): self.node = Soupy('<html><body><a>1</a><a>2</a><a>3</a></body></html>')
def test_prettify(self): s = Soupy('<html>∂ƒ</html>') assert s.prettify() == s.val().prettify()
def test_node_properties(self, attr): node = Soupy('<b><d></d><c>test</c><d></d></b>').find('c') dom = node.val() assert getattr(node, attr).val() == getattr(dom, attr)
def test_dump_with_method(self): node = Soupy('<a>1</a><a>2</a><a>3</a>') result = node.find_all('a').dump(a=Q.find('b').orelse('')).val() assert result == [{'a': ''}, {'a': ''}, {'a': ''}]
def test_either(self): node = Soupy('<a><b>1</b></a><a>2</a>') assert node.apply(either(Q.find('c').text, Q.find('b').text)).val() == '1'
def test_dump_with_getitem(self): node = Soupy('<a val="1">1</a>') result = node.find_all('a').dump(a=Q.attrs["val"]).val() assert result == [{'a': "1"}]
def test_find_single_fail(self, method): node = Soupy('<a class="test">test</a>') assert isinstance(getattr(node, method)('b'), NullNode)
def test_dump_with_map(self): node = Soupy('<a>1</a><a>2</a><a>3</a>') result = node.find_all('a').dump(a=Q.text.map(int)).val() assert result == [{'a': 1}, {'a': 2}, {'a': 3}]
def test_scalar_properties(self, attr): node = Soupy('<a class="foo"><b><c>test</c></b></a>').find('c') dom = node.val() assert getattr(node, attr).val() == getattr(dom, attr)
def test_nonnull_returns_self(self): s = Soupy('') assert s.nonnull() == s