2016-03-22 19 views
1

Ich mag einige kodi Addon, die re.compile Daten Schrott in BeautifulSoup4 ist der ursprüngliche Code wie diesexbmc/kodi Python Schrott Daten mit BeautifulSoup

import urllib, urllib2, re, sys, xbmcplugin, xbmcgui 
link = read_url(url) 
match = re.compile('<a class="frame[^"]*"' 
        ' href="(http://somelink.com/section/[^"]+)" ' 
        'title="([^"]+)">.*?<img src="([^"]+)".+?Length:([^<]+)', 
        re.DOTALL).findall(link) 
for url, name, thumbnail, length in match: 
addDownLink(name + length, url, 2, thumbnail) 

und der HTML-Code verwenden, bearbeiten

<div id="content"> 
    <span class="someclass"> 
    <span class="sec"> 
     <a class="frame" href="http://somlink.com/section/name-here" title="name here"> 
     <img src="http://www.somlink.com/thumb/imgsection/thumbnail.jpg" > 
     </a> 
    </span> 
    <h3 class="title"> 
     <a href="http://somlink.com/section/name-here">name here</a> 
    </h3> 
    <span class="details"><span class="length">Length: 99:99</span>  
</span> 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
</div> 

jetzt, wie alle bekommen url (href) und name und lenghth und thumbnailBeautifulSoup4 mit und fügen sie sie in addDownLink(name + length, url, 2, thumbnail)

+1

Was versuchen Sie eigentlich zu bekommen und warum benutzen Sie so eine komplizierte Regex? –

+0

@PadraicCunningham ist nicht ich, die diese komplizierte Regex im versuchen, es in BeautifulSoup4 zu konvertieren, um es einfach zu machen können Sie mir helfen ?? –

+1

Gibt es einen Klassennamen, den wir verwenden können? Oder was ist die tatsächliche Anforderung zu erfüllen? –

Antwort

1
from bs4 import BeautifulSoup 

html = """<div id="content"> 
    <span class="someclass"> 
    <span class="sec"> 
     <a class="frame" href="http://somlink.com/section/name-here" title="name here"> 
     <img src="http://www.somlink.com/thumb/imgsection/thumbnail.jpg" > 
     </a> 
    </span> 
    <h3 class="title"> 
     <a href="http://somlink.com/section/name-here">name here</a> 
    </h3> 
    <span class="details"><span class="length">Length: 99:99</span> 
</span> 
</div> 
""" 

soup = BeautifulSoup(html, "lxml") 
sec = soup.find("span", {"class": "someclass"}) 
# get a tag with frame class 
fr = sec.find("a", {"class": "frame"}) 

# pull img src and href from the a/frame 
url, img = fr["href"], fr.find("img")["src"] 

# get h3 with title class and extract the text from the anchor 
name = sec.select("h3.title a")[0].text 

# "size" is in the span with the details class 
size = sec.select("span.details")[0].text.split(None,1)[-1] 


print(url, img, name.strip(), size.split(None,1)[1].strip()) 

Welche gibt Ihnen:

('http://somlink.com/section/name-here', 'http://www.somlink.com/thumb/imgsection/thumbnail.jpg', u'name here', u'99:99') 

Wenn Sie mehrere Abschnitte haben, brauchen wir nur find_all und die Logik zu jedem Abschnitt anzuwenden:

def secs(): 
    soup = BeautifulSoup(html, "lxml") 
    sections = soup.find_all("span", {"class": "someclass"}) 
    for sec in sections: 
     fr = sec.find("a", {"class": "frame"}) 
     url, img = fr["href"], fr.find("img")["src"] 
     name, size = sec.select("h3.title a")[0].text, sec.select("span.details")[0].text.split(None,1)[-1] 
     yield url, name, img,size 

Wenn Sie nicht wissen, die ganze Klasse, aber Sie wissen zum Beispiel gibt es eine IMG-Tag, die Sie anrufen können auf dem Abschnitt finden:

sec.find("img")["src"] 

Und die gleiche Logik gilt für den Rest.

+0

dann wie man 'addDownLink (name + länge, url, 2, thumbnail)' in kodi für alle 'class =" etwas Klasse "'? –

+1

Iterieren Sie einfach über Sekunden genau wie der Fund in Ihrer Frage –

+0

danke so passen, dass slove mein Problem aber können Sie mir sagen, wie man nur '99: 99' und nicht' Length: 99: 99' –