2016-04-28 4 views
0

Es gibt viele da draußen auf BeautifulSoup, aber ich kann nichts finden, was dies beantwortet ... Ich möchte den Text zwischen zwei Bits HTML durch die Angabe des Bits extrahieren von Text vor und nach im Code. Ich kann dies tun mit Outwit Python-Modul, sondern müssen BeautifulSoup diese Zeit nutzen ...Extract Text zwischen zwei Textstrings von der Webseite mit BeautifulSoup und Python

Die Bit der Seiten, die ich will, ist die Benutzernamen unter:

<a class="generic_class" href="/people/username"> 

Also, ich möchte beautifulsoup angeben zu kratzen der Benutzername, indem sie es sagen

'a class="generic_class" href="/people/'

vor dem Bit zu suchen zu kratzen und zu stoppen, nachdem

'"'

Ich will es dann aus einer CSV diese in einer Schleife von Urls tun (das bereits funktioniert) und dann durch die Leitung zu einem neuen csv (dieses Bit wahrscheinlich nicht funktioniert), um die Ergebnisse Zeile anhängen:

for row in url_reader: 
    url = row[0] 
    page = br.open(url).read() 
    soup = BeautifulSoup(br.response().read()) 
    user = soup.findAll('<a class="generic_class" href="/people/') # this is the line where the code that works should go! Obviously this bit does nothing as it doesn't extract what comes after, stopping at the closing quotation mark for the end of the href. 
    page.append.user(output_file) # not sure if this is right?! 

Offensichtlich würde ich dies in einem if/else zu if (findet "page not found") und sonst (mach das Ding oben) mit URLs, die nicht funktionieren, behandeln, aber ich werde es tun arbeite die Fehlerbehandlung ab sobald ich die Sache tatsächlich zum Funktionieren bringen kann! Das ist meine Priorität jetzt ...

Jede Hilfe sehr geschätzt.

Antwort

0

können Sie nicht einfach "href" Attributwert extrahieren und das analysieren?

usernames = [] 

for anchor in soup.findAll('a', {'class': 'generic_class'}): 
    usernames.append(anchor['href'].split('/')[-1]) 

with open('usernames.csv', 'ab') as f: 
    writer = csv.writer(f) 
    for username in usernames: 
     writer.writerow([username]) 

Dies ist nur ein einfaches Beispiel, empfehle ich usw. einige zusätzliche Validierung macht

+0

That gibt mir AttributeError: 'set' Objekt hat kein Attribut 'items' –

+0

Nicht sicher, wo hast du diesen Fehler aus, habe ich dies zu testen: html_doc = ""“ Test

""“ welcher Zeile, dass Fehler herkommt? – Evolter

+0

Tracelack sagt die erste Zeile Ihrer vorgeschlagenen Antwort :( –

0

Sie eine Funktion im href Attribut passieren kann:

def start_with_people(href): 
    return href and href.startswith('/people/') 

a_tags = soup.find_all('a', class_='generic_class', href=start_with_people) 

Diese alle <a> Tags zurück die haben eine href beginnend mit /people/.

Sobald Sie diese Anker-Tags:

  1. können Sie Schleife über sie

  2. erhalten die href Wert

  3. es aufgeteilt und erhalten den Benutzernamen

+0

Das gibt mir einen Fehler: a_tags = soup.find_all ('a', Klasse _ = 'generic_class', href = start_with_people) TypeError: 'NoneType' -Objekt ist nicht aufrufbar –

+0

Wenn ich es zu 'soup.findAll' ändern dann ist es kein Fehler, aber es findet auch nichts. –

+0

Welche Version hast du? – AKS

Verwandte Themen