2017-03-27 11 views
3

watchseriesfree.toウェブサイト上の特定のファイルホストからいくつかのリンクを抽出しようとしています。以下の場合、私はrapidvideoリンクをしたいので、私はrapidvideo正規表現がbs4で動作しない

import re 
import urllib2 
from bs4 import BeautifulSoup 

def gethtml(link): 
    req = urllib2.Request(link, headers={'User-Agent': "Magic Browser"}) 
    con = urllib2.urlopen(req) 
    html = con.read() 
    return html 


def findLatest(): 
    url = "https://watchseriesfree.to/serie/Madam-Secretary" 
    head = "https://watchseriesfree.to" 

    soup = BeautifulSoup(gethtml(url), 'html.parser') 
    latep = soup.find("a", title=re.compile('Latest Episode')) 

    soup = BeautifulSoup(gethtml(head + latep['href']), 'html.parser') 
    firstVod = soup.findAll("tr",text=re.compile('rapidvideo')) 

    return firstVod 

print(findLatest()) 

を含むテキストで、これらのタグをフィルタする正規表現を使用ししかし、上記のコードは空白のリストを返します。私は間違って何をしていますか?

+1

NBは:: 'findAll'はBS4でfind_all''に名前が変更されているようだあなたは何ができるか

searching functionを使用して.get_text()を呼び出すことによってtr要素の実際のテキストをチェックすることです。 (どうやら、bs3のバージョンは保持されていましたが、とにかくあなたのコードを更新していました。) 'find_all'関数のシグネチャには' text'パラメータがなく 'string'パラメータもあります。 – Evert

答えて

4

問題はここにある:

firstVod = soup.findAll("tr",text=re.compile('rapidvideo')) 

BeautifulSoupは、あなたのテキストの正規表現パターンを適用するとき、それはすべての一致tr要素の.string attribute値を使用します。さて、.stringは、この重要な注意点がある - の要素は、複数の子を持つ場合.stringNoneで、を:

タグが複数のものが含まれている場合、それはを参照してください何.string明らかではないので、.stringですNoneと定義される。

したがって、結果はありません。

soup.find_all(lambda tag: tag.name == 'tr' and 'rapidvideo' in tag.get_text()) 
関連する問題