Необходимо создать набор данных для новостей с использованием Python - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно создать набор данных для новостей.Мне нужно извлечь все новости данного новостного сайта, которые когда-либо были размещены на этом сайте.Я написал этот код

import requests     
from bs4 import BeautifulSoup    
import pandas    
import csv    
from datetime import datetime

records=[]

def cnbc(base_url):

    r = requests.get(base_url)    
    c = r.content    
    soup = BeautifulSoup(c,"html.parser")    
    Title=soup.find("h1","class":"title"}).text.replace("\r","").replace("\n","")
    content=' '
    for content_tag in soup.find_all("p"):
        content = content+content_tag.text.replace("\r","").replace("\n","")
    content= content[18:-458]
    Country ='United States'
    website='https://www.cnbc.com/' 
    comments='' 
    genre='Political'
    date= soup.find("time",{"class":"datestamp"}).text[35:-2].replace("\r","").replace("\n","")
    d = datetime.strptime(date, "%d %b %Y")
    date = d.strftime("%d-%m-%Y")
    records.append((Title,content,Country,website,comments,genre,date))

cnbc("https://www.cnbc.com/2018/11/02/here-are-the-three-things-pulling-down-the-stock-market-again.html")

, но это позволяет мне извлечь только одну новость.

Может кто-нибудь сказать мне, как я могу извлечь все URL-адреса новостей из корневого каталога веб-сайта?.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Существует грубый метод для извлечения части всех новостей, этот метод показан как мой код. Сначала извлеките все новости, которые div класс является заголовком news_headline = soup.find_all("div",class_="headline"). Затем проверьте, является ли элемент тем, что мы хотим.

new = []
for div in news_headline:
    each = ()
    if div.a:
        each[0] = url + div.a.get("href")
        if div.a.text:
            # use split to remove \t \n blankspace
            each[1] = " ".join(div.a.text.split())
        else:
            each[1] = " ".join(div.a.get("title").split())
        new.append(each)
    else:
        continue

Это полный код, но я написал его так коротко, как только смогу.

import requests     
from bs4 import BeautifulSoup    

def index(url="https://www.cnbc.com/world/"):
    with requests.Session() as se:
        se.encoding = "UTF-8"
        res = se.get(url)
        text = res.text
    soup = BeautifulSoup(text,"lxml")
    news_headline = soup.find_all("div",class_="headline")
    news_ = [(url + div.a.get("href"), " ".join(div.a.text.split()) if div.a.text else  "".join(div.a.get("title").split()) ) for div in news_headline if div.a]
    print(news_)

index()
0 голосов
/ 10 ноября 2018

Это скрипт на python3, и он не безупречен, но я надеюсь, что он может послужить отправной точкой, чтобы вы могли достичь того, что пытаетесь. Я не уверен, что этот сайт, с которого вы пытаетесь очистить данные, разрешает такую ​​операцию, поэтому я не буду размещать их веб-адреса для констант WEB_SITE_BASE_URL и WEB_SITE_REGION_URL. Это ваш выбор, что вы собираетесь поместить туда.

import requests     
from bs4 import BeautifulSoup     
from datetime import datetime

# https://www.xxxx.com"
WEB_SITE_BASE_URL= ""
# https://www.xxxx.com/?region=us
WEB_SITE_REGION_URL = ""

def get_categories(web_site_base_url):
    r = requests.get(web_site_base_url)    
    c = r.content    
    soup = BeautifulSoup(c,"html.parser")    
    spans = soup.find_all(attrs={"nav-menu-buttonText"})
    categories = [category.text for category in spans]
    return categories

def get_links(category_url):
    r = requests.get(category_url)
    c = r.content    
    soup = BeautifulSoup(c,"html.parser")
    links = [a.get('href') for a in soup.find_all('a', href=True)]
    filtered_links = list(set([k for k in links if '/2018/11/' in k]))
    return filtered_links

def news(link):
    r = requests.get(link)    
    c = r.content    
    soup = BeautifulSoup(c,"html.parser")    
    Title=soup.find("h1",{"class":"title"}).text.replace("\r","").replace("\n","")
    content=' '
    for content_tag in soup.find_all("p"):
        content = content+content_tag.text.replace("\r","").replace("\n","")
    content= content[18:-458]
    Country ='United States'
    website='WEB_SITE_BASE_URL' 
    comments=''
    date= soup.find("time",{"class":"datestamp"}).text[35:-2].replace("\r","").replace("\n","")
    d = datetime.strptime(date, "%d %b %Y")
    date = d.strftime("%d-%m-%Y")  
    spans = soup.find_all(attrs={"header_title last breadcrumb"})
    categories = [category.text for category in spans]
    genre = categories
    return(Title,content,Country,website,comments,genre,date)

categories = get_categories(WEB_SITE_REGION_URL)
list_of_link_lists = []
for category in categories:
    list_of_link_lists.append(get_links(WEB_SITE_BASE_URL + "/" + category.replace(" ", "20%")))
flat_link_list = list(set([item for sublist in list_of_link_lists for item in sublist]))
articles_list = []
for link in flat_link_list:
    try:
        articles_list.append(news(WEB_SITE_BASE_URL + link))
    except:
        print("Something was wrong")
    continue

print(articles_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...