2017-06-29 74 views
1

我想编写一个脚本来获取主页的链接到社交媒体(主要是twitter/facebook),而且我完全陷入僵局,因为我对Python很新。使用python获取网站主页的链接

我想要完成的任务是解析网站,找到社交媒体链接,并将其保存在新的数据框中,其中每列包含原始URL,Twitter链接和Facebook链接。这里是我到目前为止此代码为纽约时报网站:

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') 

我有一些问题了解什么环路是干什么的,或如何使之成为什么,我需要它的工作。我也试图存储网站,而不是做print(site),但那不起作用......所以我想我会寻求帮助。在问之前,我在这里经历了一系列的反应,但没有人能让我做我需要做的事情。

+1

您的'if'语句没有任何用处。它检查列表“sm_sites”中的每个元素是否在lsit“sm_sites”中,这显然总是真实的并且完全不相关。你想要什么条件来检查? – jacoblaw

+0

@jacoblaw我想写一些让我检查'sm_sites'中的每个网站是否都在'all_links'中的东西。然后,我想要完成额外的步骤(并且不知道如何将其写入python),我想将它们的twitter和facebook的完整链接存储为熊猫DF中的列。理想情况下,我希望这些代码能够为几个网站做这些事情(但是,我认为这是循环的目的,所以我可以围绕这个来编写一个循环)。 – rowbust

回答

4

这段代码的工作方式,你已经有了你的链接。您的主页链接是开始url,所以http://www.nytimes.com
而你有社交媒体网址sm_sites = ['twitter.com','facebook.com'],你所做的只是确认它们存在于主页面上。如果你想保存证实社交媒体的URL列表,然后将它们添加到列表

这里下车的网页社交媒体链接的一种方式

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) 

输出:

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

更新
对于网址的DF

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') 

输出enter image description here

+0

哦,这非常有帮助!我有两个问题。一,我怎样才能把'sm_sites_present'放在一个熊猫DF中,其中每个'sm_site'是一列,'url'是第一列?二,在没有链接的情况下,如何在这个DF中附加一些说'无链接'的东西? – rowbust

+0

哦...我刚刚读了第一部分...尝试使用'df.fillna(value =“no link”)''。 *编辑*我包括它 – Alter

0

这将做你想要把它添加到数据框的问候。您可以遍历网站列表(urlsToSearch),为每个包含基本网站,所有Facebook链接和所有Twitter链接的数据框添加一行。

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