2017-03-27 3 views
3

Ich versuche, einige Links von einem bestimmten Filehoster auf watchseriesfree.to Website zu extrahieren. Im folgenden Fall möchte ich rapidvideo Links, so dass ich regex rapidvideoRegex funktioniert nicht in 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()) 

jedoch der obige Code diese Tags mit Text enthält, um herauszufiltern gibt eine leere Liste. Was mache ich falsch?

+1

NB: 'findAll' scheint' find_all' in BS4 umbenannt wurden. (Anscheinend wurde die bs3-Version beibehalten, aber ich würde den Code sowieso aktualisieren.) Die 'find_all'-Funktionssignatur hat auch keinen' text'-Parameter, sondern einen 'string' -Parameter. – Evert

Antwort

4

Das Problem ist hier:

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

Wenn BeautifulSoup Ihren Text RegexMuster gelten, es .string attribute Werte aller angepassten tr Elemente verwenden würden. Nun hat die .string diese wichtige Einschränkung - , wenn ein Element mehrere Kinder hat, .string ist None:

Wenn ein Tag mehr als eine Sache enthält, dann ist es nicht klar, welche .string beziehen soll, so .string ist definiert als None.

Sie haben also keine Ergebnisse.

Was Sie tun können, ist den eigentlichen Text der tr Elemente zu überprüfen, indem Sie einen searching function mit und ruft .get_text():

soup.find_all(lambda tag: tag.name == 'tr' and 'rapidvideo' in tag.get_text())