2017-02-02 9 views
1

私はPython初心者です。Python3でBeautiful Soup 4を使用してWebクローラーを作成しようとしています。チャンネルのリンクが入力されると、チャンネル名、チャンネルの説明、チャンネルによって投稿された動画、視聴回数、およびそれらの動画へのリンクがスクラップされます。 は、ここでは、コードです:Pythonを使用してBeautiful Soup 4の特定のクラスタグで 'title'を取得できない

from tkinter import * 
from bs4 import BeautifulSoup 
import re 
import requests 


def Info_channel(): 
    links=link.get() 
    r=requests.get(links) 
    soup=BeautifulSoup(r.content,"lxml") 
    channelname= "Channel Name:" + soup.title.string 
    first=Label(text=channelname,fg='yellow',bg='black').place(x=0,y=0) 
    vid_name,viewstr,view_count,disp_link=None,None,None,None 

    placer=0 
    placer1 = 0 
    space = 0 

    for name in soup.find_all('a',class_="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2"): 
     vid_name=name.text 
     second=Label(text=vid_name,fg='black',bg='white').place(x=200,y=40+space) 
     space=space+20 

    desc_list=soup.find_all(attrs={'name':'description'}) 
    desc=desc_list[0]['content']#.encode('utf-8') 
    third=Label(text=desc,fg='black',bg='yellow').place(x=0,y=20) 
    for view_find in soup.find_all('li'): 
     viewstr=view_find.text 
     view=re.findall('[0-9]+,[0-9]+ views',viewstr) 
     for views in view: 
      view_count=Label(text=views,fg='blue').place(x=650,y=40+placer) 
      placer=placer + 20 

    for all_links in soup.find_all('a',class_="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2"): 
     vid_link=all_links.get('href') 
     final_link="https://www.youtube.com"+vid_link 
     disp_link=Label(text=final_link).place(x=750,y=40+placer1) 
     placer1=placer1+20 


gui=Tk() 
gui.geometry('500x400') 
gui.title('YouTube Crawler') 
label=Label(text='Paste Link Here',fg='blue') 
label.pack() 
link=StringVar() 
entry=Entry(gui,textvariable=link) 
entry.pack() 
channel=Button(text='Crawl this Channel',fg='white',bg='black',width=30,command=Info_channel) 
channel.place(x=10,y=45) 

entry.focus_set() 
url=entry.get() 
gui.mainloop() 

私が午前問題はこの部分である:例えばのために

for name in soup.find_all('a',class_="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2"): 
     vid_name=name.text 
     second=Label(text=vid_name,fg='black',bg='white').place(x=200,y=40+space) 
     space=space+20 

:上記のリンク

https://www.youtube.com/user/MetallicaTV

はチャンネル内のビデオを持っています上の検査要素は

a `class ="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2" dir="ltr" title="Metallica: Hardwired (Official Music Video)"` 

タイトル「Metallica:Hardwired(Official Music Video)」の部分を抽出します。

私が直面している問題は、コードが上記のforループ(soup.find_allの名前に対して.............)を全く入力しないことです。一部が始まらない!

どこが間違っているのでしょうか?

出力は私が取得: Output image

答えて

0

あなたは複数のクラスを持つ要素を選択している、唯一の文字列内の各クラス名の間にスペースがあることができます。言い換えれば

、次の行:

class_="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2" 
#           ^^  ^^ 

は次のようになります。

for anchor in soup.find_all('a', class_="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2"): 
    print(anchor.text) 

class_="yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2" 

したがって、あなたのケースであなたがあなたのループを更新する必要があります代わりに.select()メソッドを使用することをおすすめします。

下のあなたのコメントに応えて
for anchor in soup.select('.yt-lockup-video a.yt-uix-tile-link'): 
    print(anchor.text) 

、あなたが使用することができ、ビューを取得しようとしている場合:

view_tags = soup.find_all('li', text=re.compile("[\d,]+ views")) 
for view_tag in view_tags: 
    views = re.findall(r'[\d,]+', view_tag.text)[0] 
    print(views) 
+1

男は、あなたの美しさ!あなたは私を救った、それは今完全にビデオ名を表示します。しかし、2番目のforループ:soup.find_all ...........のall_linkについてはまだ手つかずのままですが、このループでも述べたようにスペースを削除しましたが、動作しません。なにか提案を? –

+0

男、あなたは美人です!あなたは私を救った、それは今完全にビデオ名を表示します。しかし、2番目のforループ:soup.find_all ...........のall_linkについてはまだ手つかずのままですが、このループでも述べたようにスペースを削除しましたが、動作しません。なにか提案を? –

+0

@AyushGoyal - あなたは試しましたか? 'soup.find_all(' a '、class _ = "yt-uix-sessionlink yt-uix-tile-link spf-link yt-ui-ellipsis yt-ui-ellipsis-2 "):'? –

関連する問題