Python 网页抓取新闻文章并导出为csv文件

Python 网页抓取新闻文章并导出为csv文件,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,上个月左右,我一直在学习python的基础知识,虽然我非常擅长打印“hello world”,但我想学习一些额外的功能。我已经下载了BeautifulSoup4,正在使用Python2.7。我的目标是能够从CNN或其他新闻来源获得一篇文章,并能够放弃4件事: 1链接到该网站 2发表日期文章 3文章标题 第4条案文 我在stackoverflow中搜索了其他问题,并查看了其他示例代码,但在将其应用于我想做的事情时遇到了问题。我看到的大多数例子都是关于一天中的时间或天气的。我的主要问题是,当我查看某

上个月左右,我一直在学习python的基础知识,虽然我非常擅长打印“hello world”,但我想学习一些额外的功能。我已经下载了BeautifulSoup4,正在使用Python2.7。我的目标是能够从CNN或其他新闻来源获得一篇文章,并能够放弃4件事: 1链接到该网站 2发表日期文章 3文章标题 第4条案文

我在stackoverflow中搜索了其他问题,并查看了其他示例代码,但在将其应用于我想做的事情时遇到了问题。我看到的大多数例子都是关于一天中的时间或天气的。我的主要问题是,当我查看某个特定网站的源代码时,我很难知道应该使用哪些标签

例如,如果我想将上述4件东西从:


代码是什么样子的?

您需要做几件事:

使用urllib或python请求下载网页

使用BeautifulSoup4 bs4解析页面

通过开发者工具Ctrl+Shft+C,使用Chromeor或其他浏览器,识别您想要解析的网页部分,然后单击文章的文本正文,这样您就可以看到您想要解析的HTML元素。在本例中,您可以看到您希望所有HTML元素都具有类cnn\u storypgraphtxt,您可以使用soup.find\u allp,class=cnn\u storypgraphtxt选择该类


我相信你可以自己找出剩下的部分,至于包含日期和标题等的元素在哪里。

这是一个概念验证代码,可以让你的想法发挥作用,只是想让你知道,BeautifulSoup4非常强大,对于你的第一步刮削来说绝对足够了

此外,您还需要阅读CNN的服务条款,以检查是否允许刮擦。您可以在下面的BS4文档中找到对代码每个细节的解释,也可以从stackoverflow开始您的职业生涯,从社区中学习每个细节,就像我所做的:祝您好运,并享受它

from bs4 import BeautifulSoup, SoupStrainer
import urllib2
import re

def main():
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    url = 'http://www.cnn.com/2013/10/29/us/florida-shooting-cell-phone-blocks-bullet/index.html?hpt=ju_c2'
    soup = BeautifulSoup(opener.open(url))
    #1) Link to the website 

    #2) Date article published 
    date = soup.find("div", {"class":"cnn_strytmstmp"}).text.encode('utf-8')
    #3) title of article 
    title = soup.find("div", {"id":"cnnContentContainer"}).find('h1').text.encode('utf-8')
    #4) Text of the article
    paragraphs = soup.find('div', {"class":"cnn_strycntntlft"}).find_all('p')
    text = " ".join([ paragraph.text.encode('utf-8') for paragraph in paragraphs])

    print url
    print date
    print title 
    print text

if __name__ == '__main__':   
     main()
输出如下所示:

http://www.cnn.com/2013/10/29/us/florida-shooting-cell-phone-blocks-bullet/index.html?hpt=ju_c2
updated 7:34 AM EDT, Tue October 29, 2013
Cell phone stops bullet aimed at Florida gas station clerk
(CNN) -- A gas station clerk's smartphone may... the TV station reported. 
同时,我还介绍了我们应该如何定位元素的一些理念: 稍后您可能还会遇到Selenium/Scrapy..

您在页面本身中找不到页面的URL,但这不是问题,因为您必须在获取页面之前知道该URL

在特定于站点的情况下,刮取功能最为强大:您需要检查CNN站点页面的格式,确定它们将文章日期放在何处,通过检查html源在文档层次结构中找到自己的方式,然后设计一种提取方式

以最通用的方式,您最多可以识别一般类型的信息:您可以编写一个脚本,从页面中提取所有日期,或者根据您的条件提取尽可能多的日期,但是没有通用的方法来知道哪个日期代表发布日期。类似地,以一种非常通用的方式提取标题和文本充其量只是猜测,因为有很多方法可以将这些信息嵌入到网页中,以及网站可能会与之混合的许多其他内容中


最后,不要忘记,许多站点(尽管不是所有站点)都会向您发送一个简单的html页面,并使用javascript填充内容。除非您在尝试抓取页面之前使用类似于解释javascript的内容,否则您的脚本将看到与浏览器显示的内容截然不同的内容。

B W先生。谢谢您的回答。什么是“utf-8”?@智能错误的utf-8告诉python使用utf-8解释文本,这是浏览器解码的方式。否则,sth.text将返回unicode而不是字符串。我正在尝试运行您的代码,但由于没有名为“urllib2”的模块而出现错误。我有使用Anaconda的Python 2.7。