我上个月左右一直在学习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
代码会是什么样的?
答案 0 :(得分:5)
这是一个概念代码的证明,可以让你的想法发挥作用,只是为了让你知道,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.
与此同时,关于我们应如何定位元素的一些哲学:link here. 和Selenium / Scrapy你可能也会在以后遇到..
答案 1 :(得分:2)
你想要做一些事情:
使用urllib
或python-requests
使用BeautifulSoup4
(bs4
)
通过开发人员工具使用Chrome(或其他浏览器)识别您要解析的网页部分( Ctrl + Shft + C )并单击文章的文本正文,这将允许您查看要解析的HTML元素。在这种情况下,您可以看到您希望使用cnn_storypgraphtxt
soup.find_all("p", class_="cnn_storypgraphtxt")
类的所有HTML元素
我相信你能够自己弄清楚其余部分,包含日期和标题等的元素。
答案 2 :(得分:2)
您无法在页面本身中找到页面 的网址,但这不是问题,因为您在获取网页之前必须知道该网址。
当特定于网站时,刮痧是最强大的:你需要检查(比方说)CNN网站的页面格式,确定他们放置文章日期的位置,找到你的方式通过检查html源文档层次结构,然后设计一种提取它的方法。
以最常见的方式,您最多可以识别通用类型的信息:您可以编写一个脚本,从页面中提取所有日期(或者您的条件可以匹配的数量),但是没有一般方法知道哪一个代表出版日期。同样,以一种非常通用的方式提取标题和文本最多只是猜测,因为有很多方法可以将这些信息嵌入到网页中(还有很多其他方法)网站可能与之混合的东西)。
最后,不要忘记许多网站(虽然不是全部)会向您发送一个简单的html页面并使用 javascript 来填充内容。除非您在尝试抓取页面之前使用webkit之类的内容来解释javascript,否则您的脚本会看到与浏览器显示的内容截然不同的内容。