2017-06-29 2 views
1

Ich möchte ein Skript schreiben, um eine Homepage-Links zu Social Media (twitter/facebook meist), und ich bin völlig stecken, da ich Python ziemlich neu bin.Holen Sie sich Links von der Homepage einer Website mit Python

Die Aufgabe, die ich erreichen möchte, besteht darin, die Website zu analysieren, die Social-Media-Links zu finden und sie in einem neuen Datenrahmen zu speichern, in dem jede Spalte die ursprüngliche URL, den Twitter-Link und den Facebook-Link enthält. Hier ist, was ich bisher von diesem Code für die New York Times Website haben:

from bs4 import BeautifulSoup 
import requests 

url = "http://www.nytimes.com" 
r = requests.get(url) 
sm_sites = ['twitter.com','facebook.com'] 

soup = BeautifulSoup(r.content, 'html5lib') 
all_links = soup.find_all('a', href = True) 


for site in sm_sites: 
    if all(site in sm_sites for link in all_links): 
     print(site) 
    else: 
     print('no link') 

Ich habe einige Probleme mit zu verstehen, was die Schleife tut, oder wie man es für funktioniert, was ich brauche es. Ich hatte auch versucht, die Seite zu speichern, anstatt print(site) zu tun, aber das hat nicht funktioniert ... Also dachte ich, ich würde um Hilfe bitten. Bevor ich gefragt habe, habe ich hier einige Antworten gegeben, aber niemand konnte mich dazu bringen, das zu tun, was ich tun musste.

+1

Ihre 'if'-Anweisung macht nichts Sinnvolles. Es überprüft, ob jedes Element der Liste "sm_sites" in der lsit "sm_sites" steht, was eindeutig immer wahr und völlig irrelevant ist. Auf was sollte diese Bedingung achten? – jacoblaw

+0

@jacoblaw Ich wollte etwas schreiben, das mich prüfen lässt, ob jede der Seiten in 'sm_sites' in' all_links' steht. Dann gibt es den zusätzlichen Schritt, den ich machen möchte (und habe keine Ahnung, wie man es in Python schreibt), dass ich den vollständigen Link zu ihrem Twitter und Facebook als Spalten in einem Pandas DF speichern möchte. Im Idealfall möchte ich, dass dieser Code diese Dinge für mehrere Websites ausführt (aber ich denke, dass das die Schleifen sind, also kann ich einfach eine Schleife darum schreiben). – rowbust

Antwort

4

Wie dieser Code funktioniert, haben Sie bereits Ihre Links. Ihr Homepage Link ist der Start url, also http://www.nytimes.com.
Und Sie haben die Social-Media-URLs sm_sites = ['twitter.com','facebook.com'], alles, was Sie tun, bestätigt, dass sie auf der Hauptseite existieren. Wenn Sie die Liste der bestätigten Social-Media-URLs speichern möchten, dann hängen Sie sie auf eine Liste

Hier ist ein Weg, die Social-Media-Links aus einer Seite

import requests 
from bs4 import BeautifulSoup 

url = "https://stackoverflow.com/questions/tagged/python" 
r = requests.get(url) 
sm_sites = ['twitter.com','facebook.com'] 
sm_sites_present = [] 

soup = BeautifulSoup(r.content, 'html5lib') 
all_links = soup.find_all('a', href = True) 


for sm_site in sm_sites: 
    for link in all_links: 
     if sm_site in link.attrs['href']: 
      sm_sites_present.append(link.attrs['href']) 

print(sm_sites_present) 

Ausgabe zu erhalten:

['https://twitter.com/stackoverflow', 'https://www.facebook.com/officialstackoverflow/'] 

aktualisieren
für eine df von Urls

import requests 
import pandas as pd 
from bs4 import BeautifulSoup 
from IPython.display import display 

urls = [ 
    "https://stackoverflow.com/questions/tagged/python", 
    "https://www.nytimes.com/", 
    "https://en.wikipedia.org/" 
] 

sm_sites = ['twitter.com','facebook.com'] 
sm_sites_present = [] 
columns = ['url'] + sm_sites 
df = pd.DataFrame(data={'url' : urls}, columns=columns) 

def get_sm(row): 
    r = requests.get(row['url']) 
    output = pd.Series() 

    soup = BeautifulSoup(r.content, 'html5lib') 
    all_links = soup.find_all('a', href = True) 
    for sm_site in sm_sites: 
     for link in all_links: 
      if sm_site in link.attrs['href']: 
       output[sm_site] = link.attrs['href'] 
    return output 

sm_columns = df.apply(get_sm, axis=1) 
df.update(sm_columns) 
df.fillna(value='no link') 

Ausgabe enter image description here

+0

Oh, das ist sehr hilfreich! Ich habe zwei Fragen. Erstens, wie kann ich 'sm_sites_present' in einen Pandas-DF einfügen, wobei jede 'sm_site' eine Spalte ist und die' url' die erste Spalte ist? Zwei, wie kann ich etwas anfügen, das "keine Verbindung" in diesem DF sagt, wenn es keine Verbindungen gibt? – rowbust

+0

oh ... ich habe gerade den ersten Teil gelesen ... versuche '' df.fillna (value = "no link") 'zu benutzen. * bearbeiten * Ich habe es eingefügt – Alter

0

Dies wird tun, was Sie wollen in Bezug auf das Hinzufügen zu einem DataFrame. Sie können durch eine Liste von Websites (urlsToSearch) iterieren und dem Datenrahmen eine Zeile hinzufügen, die die Basiswebsite, alle Facebook-Links und alle Twitter-Links enthält.

from bs4 import BeautifulSoup 
import requests 
import pandas as pd 

df = pd.DataFrame(columns=["Website", "Facebook", "Twitter"]) 

urlsToSearch = ["http://www.nytimes.com","http://www.businessinsider.com/"] 

for url in urlsToSearch: 
    r = requests.get(url) 

    tw_links = [] 
    fb_links = [] 

    soup = BeautifulSoup(r.text, 'html.parser') 
    all_links = [link['href'] for link in soup.find_all('a', href = True)] #only get href 

    for link in all_links: 
     if "twitter.com" in link: 
      tw_links.append(link) 
     elif "facebook.com" in link: 
      fb_links.append(link) 

    df.loc[df.shape[0]] = [url,fb_links,tw_links] #Add row to end of df 
Verwandte Themen