2017-01-09 5 views
1

Ich habe eine Webseite mit beliebten Artikeln, die ich für jeden zitierten Webseiten-Hyperlink und den Titel des Artikels kratzen will.Scraping einer Webseite für Link-Titel und URLs mit BeautifulSoup

Die gewünschte Ausgabe meines Skripts ist eine CSV-Datei, die jeden Titel und den Artikelinhalt in einer Zeile auflistet. Wenn also 50 Artikel auf dieser Webseite vorhanden sind, möchte ich eine Datei mit 50 Zeilen und 100 Datenpunkten haben.

Mein Problem hier ist, dass die Titel der Artikel und ihre Hyperlinks in einem SVG-Container enthalten sind, der mich abschleudert. Ich habe BeautifulSoup für das Web-Scraping verwendet, bin mir aber nicht sicher, wie ich den Titel und den Hyperlink jedes Artikels auswählen soll. Jede und jede Hilfe wird sehr geschätzt.

import requests 
from bs4 import BeautifulSoup 
import re 

res = requests.get('http://fundersandfounders.com/what-internet-thinks-based-on-media/') 
res.raise_for_status() 
playFile = open('top_articles.html', 'wb') 
for chunk in res.iter_content(100000): 
    playFile.write(chunk) 
    f = open('top_articles.html') 
    soup = BeautifulSoup(f, 'html.parser') 
    links = soup.select('p') #i know this is where i'm messing up, but i'm not sure which selector to actually utilize so I'm using the paragraph selector as a place-holder 
    print(links) 

Ich bin mir bewusst, dass dies in der Tat ist ein zweistufiger Projekt: die aktuelle Version von meinem Skript nicht durch die Liste aller Hyperlinks, die ich werde kratzen eigentliche Inhalt nicht iterieren. Das ist ein zweiter Schritt, den ich leicht alleine durchführen kann, aber wenn jemand das auch gerne schreiben möchte, dann ein großes Lob an Sie.

Antwort

1

Sie sollten es in zwei Schritten tun:

  • den HTML-Code analysieren und den Link zum svg Seite svg
  • herunterladen extrahieren, analysieren es mit BeautifulSoup und extrahieren die "Blasen"

Implementierung:

from urllib.parse import urljoin # Python3 

import requests 
from bs4 import BeautifulSoup 


base_url = 'http://fundersandfounders.com/what-internet-thinks-based-on-media/' 

with requests.Session() as session: 
    # extract the link to svg 
    res = session.get(base_url) 
    soup = BeautifulSoup(res.content, 'html.parser') 
    svg = soup.select_one("object.svg-content") 
    svg_link = urljoin(base_url, svg["data"]) 

    # download and parse svg 
    res = session.get(svg_link) 
    soup = BeautifulSoup(res.content, 'html.parser') 
    for article in soup.select("#bubbles .bgroup"): 
     title, resource = [item.get_text(strip=True, separator=" ") for item in article.select("a text")] 
     print("Title: '%s'; Resource: '%s'." % (title, resource)) 

Artikeltitel und Ressourcen:

Title: 'CNET'; Resource: 'Android Apps That Extend Battery Life'. 
Title: '5-Years-Old Shoots Sister'; Resource: 'CNN'. 
Title: 'Samsung Galaxy Note II'; Resource: 'Engaget'. 
... 
Title: 'Predicting If a Couple Stays Together'; Resource: 'The Atlantic Magazine'. 
Title: 'Why Doctors Die Differently'; Resource: 'The Wall Street Journal'. 
Title: 'The Ideal Nap Length'; Resource: 'Lifehacker'. 
+0

Vielen Dank für die schnelle Antwort. Welches Modul installiere ich (für Python3) um urllib.parse und urljoin zu verwenden? Ich kann es nicht finden. – dataelephant

+0

@Harelephant 'urllib' ist eingebaut, es muss nicht installiert werden. – alecxe

Verwandte Themen