网页抓取新闻文章并导出到csv-fi

2024-06-12 02:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

例如,如果我想把上面4件事从: http://www.cnn.com/2013/10/29/us/florida-shooting-cell-phone-blocks-bullet/index.html?hpt=ju_c2

代码是什么样子的?


Tags: 代码功能标题示例hello目标world网站
3条回答

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

抓取是最强大的,当它是网站特定的:你需要检查(比如)CNN网站页面的格式,确定他们把文章日期放在哪里,通过检查html源在文档层次结构中找到你的方法,然后设计一种提取方法。

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

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

这是一个概念验证代码,让你的想法工作,只是让你知道,美化组4是非常强大的,它绝对足够你的第一阶段刮。

你还需要阅读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. 

同时,我对如何定位元素有一点看法:link here. 你可能会在以后遇到硒/碎屑。。

你需要做一些事情:

  • 使用urllibpython-requests下载网页

  • BeautifulSoup4bs4)解析页面

  • 通过开发人员工具(Ctrl+Shft+C)使用Chrome(或其他浏览器)确定要解析的网页部分,然后单击文章的文本正文,这将允许您查看要解析的HTML元素。在本例中,您可以看到您想要所有的HTML元素都具有类cnn_storypgraphtxt,您可以用soup.find_all("p", class_="cnn_storypgraphtxt")选择这些类

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

相关问题 更多 >