@ Vergeylen
>>>En fait, il faut de la chance, avoir un proxy Elite et qu'il ait été vérifié il y a peu de temps..
Le problème des proxys gratuits, c'est justement qu'il y en a plein qui ne sont pas fiables, de là le business autour des VPN payants et des proxys payants.
@ bibichouchou
Petit tuto de parsing HTML/XML avec BeautifulSoup
Illustration avec une vidéo sur d8.tv
http://www.d8.tv/d8-series/pid6654-d8-longmire.html
on y trouve dans le source de la page (CTRL U sous Firefox)
<div class="block-common block-player-programme">
<div class="bpp-player">
<div class="playerVideo player_16_9">
<canal:player videoId="980635" width="640" height="360" id="CanalPlayerEmbarque"></canal:player>
comment trouver ce qui suit videoId=, qui est l'identifiant de la vidéo ?
from urllib2 import urlopen
import bs4 as BeautifulSoup
on lit la page
html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read()
s = BeautifulSoup.BeautifulSoup(html)
On commence par chercher les balises div avec class et block-common block-player-programme
s.findAll('div', attrs={"class":u"block-common block-player-programme"})
renvoie une liste Python, cette liste peut contenir 0 à n éléments.
[<div class="block-common block-player-programme">
<div class="bpp-player">
<div class="playerVideo player_16_9">
<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>
</div>
</div>
<input id="iVideoEnCours" type="hidden" value="980635"/>
<div class="bpp-infos">
<div class="bpp-share">
<a class="twitter-share-button" data-count="hoizontal" data-lang="fr" data-text="Episode 4 : Le cancer" data-url="http://player.canalplus.fr/#/980635&sc_cmpid=TWSha
re" data-via="D8TV" href="http://twitter.com/share"></a>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<div class="fb-like" data-action="like" data-colorscheme="light" data-height="21" data-href="http://player.canalplus.fr/#/980635&sc_cmpid=FBShare" data-layout="butt
on_count" data-send="false" data-show-faces="false" data-width="145"></div>
</div>
<h3 class="bpp-title">Episode 4 : Le cancer - Longmire</h3>
</div>
<ul class="bpp-list bpp-list-empty">
</ul>
</div>]
Ici pas de programmation défensive, on suppose que le premier élément de la liste est ce que l'on veut, donc on ajoute [0] pour prendre ce premier élément
s.findAll('div', attrs={"class":u"block-common block-player-programme"})[0]
<div class="block-common block-player-programme">
<div class="bpp-player">
<div class="playerVideo player_16_9">
<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>
</div>
</div>
<input id="iVideoEnCours" type="hidden" value="980635"/>
<div class="bpp-infos">
<div class="bpp-share">
<a class="twitter-share-button" data-count="hoizontal" data-lang="fr" data-text="Episode 4 : Le cancer" data-url="http://player.canalplus.fr/#/980635&sc_cmpid=TWSha
re" data-via="D8TV" href="http://twitter.com/share"></a>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<div class="fb-like" data-action="like" data-colorscheme="light" data-height="21" data-href="http://player.canalplus.fr/#/980635&sc_cmpid=FBShare" data-layout="butt
on_count" data-send="false" data-show-faces="false" data-width="145"></div>
</div>
<h3 class="bpp-title">Episode 4 : Le cancer - Longmire</h3>
</div>
<ul class="bpp-list bpp-list-empty">
</ul>
</div>
ce qui nous intéresse est
<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>
donc on sélectionne cette ligne
s.findAll('div', attrs={"class":u"block-common block-player-programme"})[0]('canal:player')
ou, autre syntaxe
s.findAll('div', attrs={"class":u"block-common block-player-programme"})[0].find('canal:player')
renvoie une autre liste
[<canal:player height="360" id="CanalPlayerEmbarque" videoid="980635" width="640"></canal:player>]
en debug, les commandes type(x), dir(x), sont très utiles, pour savoir si on manipule un bs4 element tag (souvent dans BeautifulSoup), et si on a à notre disposition une méthode
has_key
has_attr
get
contents
text
descendants
children
ou autre
dir(soup.findAll('div', attrs={"class":u"block-common block-player-programme"})[0])
['FORMATTERS', '__call__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__eq__', '__format__', '__getattr__', '__getattribute__',
'__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__'
, '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_all_strings', '_attr_value_as_string', '_attribute_checker', '_find_all',
'_find_one', '_lastRecursiveChild', '_last_descendant', 'append', 'attribselect_re', 'attrs', 'can_be_empty_element', 'childGenerator', 'children', 'clear', 'contents',
'decode', 'decode_contents', 'decompose', 'descendants', 'encode', 'encode_contents', 'extract', 'fetchNextSiblings', 'fetchParents', 'fetchPrevious', 'fetchPreviousSi
blings', 'find', 'findAll', 'findAllNext', 'findAllPrevious', 'findChild', 'findChildren', 'findNext', 'findNextSibling', 'findNextSiblings', 'findParent', 'findParents
', 'findPrevious', 'findPreviousSibling', 'findPreviousSiblings', 'find_all', 'find_all_next', 'find_all_previous', 'find_next', 'find_next_sibling', 'find_next_sibling
s', 'find_parent', 'find_parents', 'find_previous', 'find_previous_sibling', 'find_previous_siblings', 'format_string', 'get', 'getText', 'get_text', 'has_attr', 'has_k
ey', 'hidden', 'index', 'insert', 'insert_after', 'insert_before', 'isSelfClosing', 'is_empty_element', 'name', 'namespace', 'next', 'nextGenerator', 'nextSibling', 'ne
xtSiblingGenerator', 'next_element', 'next_elements', 'next_sibling', 'next_siblings', 'parent', 'parentGenerator', 'parents', 'parserClass', 'parser_class', 'prefix',
'prettify', 'previous', 'previousGenerator', 'previousSibling', 'previousSiblingGenerator', 'previous_element', 'previous_elements', 'previous_sibling', 'previous_sibli
ngs', 'recursiveChildGenerator', 'renderContents', 'replaceWith', 'replaceWithChildren', 'replace_with', 'replace_with_children', 'select', 'setup', 'string', 'strings'
, 'stripped_strings', 'tag_name_re', 'text', 'unwrap', 'wrap']
et on y est
soup.findAll('div', attrs={"class":u"block-common block-player-programme"})[0].div('canal:player')[0].get('videoid')
'980635'
ou
soup.findAll('div', attrs={"class":u"block-common block-player-programme"})[0].div('canal:player')[0]['videoid']
'980635'
Prenez ce que vous trouvez le plus lisible !