2017-01-30 3 views
-4

Я пытаюсь извлечь истории с nbcnews.com. Сейчас у меня следующий код:Получение новостей в Python с использованием BeautifulSoup

import urllib2 
from bs4 import BeautifulSoup 

# The page that I'm getting stories from 
url = 'http://www.nbcnews.com/' 

data = urllib2.urlopen(url) 

soup = BeautifulSoup(data, 'html.parser') 

#This is the tag and class that chrome told me "top stories" are stored in 
this = soup.find_all('div', attrs={"class": "col-sm-6 col-md-8 col-lg-9"}) 

#Get the a tags in the previous tag (this is the part that returns FAR too many links 

link = [a for i in this for a in i.find_all('a')] 

#Get the titles (This works) 
title = [a.get_text() for i in link for a in i.find_all('h3')] 

#The below strips all newlines and tabs from the title name 
newtitle = [] 

for i in t: 
    s = ' '.join(i.split()) 
    if s in newtitle: 
     pass 

    else: 
     newtitle.append(s) 

print len(link) 
print len(title) 

Когда я запускаю сценарий, то «Название» список (в основном) правильно с небольшими вариациями названий заголовков на сайте (название название это не проблема, если это близко к тому же)

Моя проблема в том, что в списке ссылок есть ссылки со всего мира? Может кто-то помочь мне с этим?

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

EDIT: изменил опечатка в имени переменной

ответ

1

Глядя на веб-странице в вопросе, похоже, все newstories в h3 тегах с классом item-heading. Вы можете использовать BeautifulSoup, чтобы выбрать все сюжетные заголовки, а затем использовать .parent метод BeautifulSoup к шагу вверх в HTML дерева и получить доступ к a href, что они находятся в пределах:

In [54]: [i.parent.attrs["href"] for i in soup.select('a > h3.item-heading')] 
Out[55]: 
[{'href': '/news/us-news/civil-rights-groups-fight-trump-s-refugee-ban-uncertainty-continues-n713811'}, 
{'href': '/news/us-news/protests-erupt-nationwide-second-day-over-trump-s-travel-ban-n713771'}, 
{'href': '/politics/politics-news/some-republicans-criticize-trump-s-immigration-order-n713826'}, 
... # trimmed for readability 
] 

Я использовал список понимание, но вы может отщепляются в составных этапов:

# select all `h3` tags with the matching class that are contained within an `a` link. 
# This excludes any random links elsewhere on the page. 
story_headers = soup.select('a > h3.item-heading') 

# Iterate through all the matching `h3` items and access their parent `a` tag. 
# Then, within the parent you have access to the `href` attribute. 
list_of_links = [i.parent.attrs for i in story_headers] 

# Finally, extract the links into a tidy list 
links = [i["href"] for i in list_of_links] 

После того, как у вас есть список ссылок, вы можете перебирать через него, чтобы проверить, является ли первый символ является /, чтобы соответствовать только локальные ссылки, а не внешние ссылки.

+0

Спасибо, сэр, я играл с базовыми веб-страницами с BS4, но после того, как догнал HTML, я хотел попытаться перемещаться по более сложным страницам. +1 к вам. Спасибо, что помогли мне. Это сделает приятное дополнение к моему помощнику голоса. Что такое новостные статьи, если вы связаны с неправильным, не так ли? ;) – Jebby

+0

Добро пожаловать. Пожалуйста, примите этот ответ, если он решит вашу проблему, он вернет мне очки взамен. Спасибо :) –

+0

На данный момент меня нет дома, поэтому я не могу проверить код. Когда я вернусь домой, я проверю, если это сработает, я приму ответ. – Jebby