2016-05-11 2 views
1

Ich erhalteDer Versuch, durch die Elemente mit BeautifulSoup Schleife Aber ich halte ‚NavigableString‘ Objekt bekommen kein Attribut den Fehler ‚a‘

'NavigableString' object has no attribute 'a' 

Wenn ich es wie diese versuchen

 def get_vlad(url): 
      html = requests.get(url, headers=headers) 
      soup = BeautifulSoup(html.text, 'html5lib') 
      divs = soup.findAll('section', 'videos')[0] 

      entries = [{'text': div.strong.a.text, 
         'link': div.a.get('href'), 
         'img': div.find('img').get('src') 
         } for div in divs] 
      return entries 

hat ich erhalte diese Fehler

'NavigableString' object has no attribute 'a' 

aber wenn ich es wie folgt

 def get_vlad(url): 
      html = requests.get(url, headers=headers) 
      soup = BeautifulSoup(html.text, 'html5lib') 
      divs = soup.findAll('section', 'videos') 

      entries = [{'text': div.strong.a.text, 
         'link': div.a.get('href'), 
         'img': div.find('img').get('src') 
         } for div in divs] 
      return entries 

Es funktioniert. Aber es gibt ungefähr 4

<div class="video"> 

divs. So dauert es das erste Video von jedem

<div class="video"> 

Abschnitt. Aber ich möchte alle Videos im selben div durchlaufen. Also habe ich diese

divs = soup.findAll('section', 'videos')[0] 

aber das gibt mir den Fehler, damit ich diesen versuchte

divs = soup.find('section', 'videos') 

Zu denken, dass es das erste Video div und eine Schleife durch alle diese divs zielen würde, aber das hat nicht funktioniert heres die hTML-Struktur ich Schaben

 <section class="video"> 
      <section class="box"> 
        <a href="/videos/video.php?v=wshhO9CO5349voIH6k6b" class="video-box"> 
        <img src="http://hw-static.example.org/u/pic/2016/05/2cuPh1LdFzJo.jpg" width="222" height="125" alt=""> 
        </a> 
        <strong class="title"><a href="/videos/video.php?v=wshhO9CO5349voIH6k6b">Stays Wildin: Blac Youngsta Showing Out With His Money!</a></strong> 
        <div> 
        <span class="views">318,105</span> 
        <span class="comments"><a href="http://www.example.org/videos/video.php?v=wshhO9CO5349voIH6k6b#disqus_thread" data-disqus-identifier="94122">3717</a></span> 
        </div> 
      </section> 

      <section class="box"> 
        <a href="/videos/video.php?v=wshhO9CO5349voIH6k6b" class="video-box"> 
        <img src="http://hw-static.example.org/u/pic/2016/05/2cuPh1LdFzJo.jpg" width="222" height="125" alt=""> 
        </a> 
        <strong class="title"><a href="/videos/video.php?v=wshhO9CO5349voIH6k6b">Stays Wildin: Blac Youngsta Showing Out With His Money!</a></strong> 
        <div> 
        <span class="views">318,105</span> 
        <span class="comments"><a href="http://www.example.org/videos/video.php?v=wshhO9CO5349voIH6k6b#disqus_thread" data-disqus-identifier="94122">3717</a></span> 
        </div> 
      </section> 

      <section class="box"> 
        <a href="/videos/video.php?v=wshhO9CO5349voIH6k6b" class="video-box"> 
        <img src="http://hw-static.example.org/u/pic/2016/05/2cuPh1LdFzJo.jpg" width="222" height="125" alt=""> 
        </a> 
        <strong class="title"><a href="/videos/video.php?v=wshhO9CO5349voIH6k6b">Stays Wildin: Blac Youngsta Showing Out With His Money!</a></strong> 
        <div> 
        <span class="views">318,105</span> 
        <span class="comments"><a href="http://www.example.org/videos/video.php?v=wshhO9CO5349voIH6k6b#disqus_thread" data-disqus-identifier="94122">3717</a></span> 
        </div> 
      </section> 
    </section> 

    <section class="video"></section> 
    <section class="video"></section> 

möchte ich durch die erste

iterieren

und ziehen Sie alle Videos von dort aus. Was momentan mit meinem Code passiert, ist, dass ich das erste Video von jedem Videoabschnitt mache, was ich nicht machen möchte. Warum also wird das nicht

divs = soup.findAll('section', 'videos')[0] 

oder diese

divs = soup.find('section', 'videos') 

Arbeit?

Antwort

0

alle Vorausgesetzt, die Abschnitte tatsächlich Elemente enthalten dies funktioniert, müssen Sie div.find("strong") verwenden, und die Klasse ist Video nicht Videos:

divs = soup.find_all('section', 'video') 
entries = [{'text': div.find("strong").a.text, 
      'link': div.a.get('href'), 
      'img': div.find('img').get('src') 
      } for div in divs] 

Wenn es tatsächlich einige Tags wie <section class="video"></section> oder nicht alle sind die Kinder sind in jedem, dann wirst du das berücksichtigen und filtern müssen. auch divs = soup.findAll('section', 'video')[0] würde die erste Video Abschnitt die gleiche wie die Verwendung von finden, wenn Sie sie alle dann müssen Sie find_all verwenden und nur iterieren, wie Sie sind.

Die Daten, die Sie wollen auch auf der class = Box zu sein scheint zu bekommen, die tatsächlich ist, was Sie scheinen zu wollen:

soup = BeautifulSoup(h,"html5lib") 


sections= soup.select("section.video section.box") 
print(sections) 

entries = [{'text': sec.find("strong").a.text, 
      'link': sec.a.get('href'), 
      'img': sec.find('img').get('src') 
      } for sec in sections] 


from pprint import pprint as pp 

pp(entries) 

, die Sie gibt: Offensichtlich

[{'img': u'http://hw-static.example.org/u/pic/2016/05/2cuPh1LdFzJo.jpg', 
    'link': u'/videos/video.php?v=wshhO9CO5349voIH6k6b', 
    'text': u'Stays Wildin: Blac Youngsta Showing Out With His Money!'}, 
{'img': u'http://hw-static.example.org/u/pic/2016/05/2cuPh1LdFzJo.jpg', 
    'link': u'/videos/video.php?v=wshhO9CO5349voIH6k6b', 
    'text': u'Stays Wildin: Blac Youngsta Showing Out With His Money!'}, 
{'img': u'http://hw-static.example.org/u/pic/2016/05/2cuPh1LdFzJo.jpg', 
    'link': u'/videos/video.php?v=wshhO9CO5349voIH6k6b', 
    'text': u'Stays Wildin: Blac Youngsta Showing Out With His Money!'}] 

sie sind alle gleich mit der Probe, aber ich nehme an, in der realen html sind sie alle unterschiedlich, wenn Sie die Daten in jeden Video Abschnitt brechen wollen, erhalten Sie zuerst die Video-Abschnitte dann in jedem die section.box suchen.

+0

danke für die Antwort Ich werde das jetzt versuchen. und die Klasse ist Videos, eine Kopie und Einfügen Fehler – nothingness

+0

@nothingness, versuchen Sie die Bearbeitung zuerst und sehen, ob das ist, was Sie eigentlich wollen –

+0

es funktioniert nicht. Und ist diese Syntax korrekt in Ihrem Code ("section.video section.box") Ich habe das nie in allen Beispielen gesehen, die ich gesehen habe – nothingness

Verwandte Themen