Python网页刮痧与美丽的汤 - 遇到麻烦

时间:2015-10-05 00:19:34

标签: python web-scraping beautifulsoup

我正在使用BeautifulSoup尝试拉取CNN主页上不同主题的顶部链接或顶部标题。我似乎在这里遗漏了一些东西,并希望得到一些帮助。我之前设法提出了一些网络刮刀,但它总是遇到很多阻力,而且是一场艰苦的战斗。

对我来说,我需要的链接最终存储在这样的地方:

<article class="cd cd--card cd--article cd--idx-1 cd--extra-small cd--has-siblings cd--media__image" data-vr-contentbox="/2015/10/02/travel/samantha-brown-travel-channel-feat/index.html" data-eq-pts="xsmall: 0, small: 300, medium: 460, large: 780, full16x9: 1100" data-eq-state="small">

我可以在data-vr-contentbox之后获取该链接并将其附加到www.cnn.com的末尾,它会将我带到我需要的页面。我的问题是实际抓住那个链接。我尝试了各种形式来抓住它们。我目前的迭代如下:

r = requests.get("http://www.cnn.com/")

data = r.text
soup = BeautifulSoup(data)

for link in soup.findAll("article"):
    test = link.get("data-vr-contentbox")
    print(test)

我的问题是它似乎只抓住了我真正需要的一些东西。我只看到两篇来自政治的文章,没有一篇来自旅游等。我会很感激在解决这个问题上给予了一些帮助。我想抓住每个主题下的所有链接。现在我只是把政治或旅行作为开始的基础。

特别是,我希望能够指定主题(技术,旅游,政治等)并抓住这些头条新闻。我是否可以简单地抓住链接并使用它们从各自的页面获取标题,或者只是从这里抓住标题......我似乎无法做到。能够一次查看单个主题中的所有内容会很好,但是找出如何缩小范围并不是很简单。

一个示例文章是“IOS 9的Wi-Fi Assist功能成本高昂”,可以在标签中找到。 我希望能够在主页上的“技术”标题下找到所有文章,然后隔离这些标记以获取标题。此标题的标记如下所示:

<div class="strip-rec-link-title ob-tcolor">IOS 9's Wi-Fi Assist feature costly</div>

但我不知道如何做这些事情。我甚至无法抓住标题,尽管当我尝试这个时它在标签内:

for link in soup.findAll("div"):
    print("")
    print(link)

我觉得我在某个地方有一个根本的误解,虽然我之前设法做了一些刮刀。

1 个答案:

答案 0 :(得分:1)

我的猜测是cnn.com网站上有一堆javascript,在beautifulsoup读取之后呈现了很多内容。我打开了cnn.com并查看了safari中的源代码,共有197个data-vr-contentbox个实例。然而,当我通过beautifulsoup运行并将其丢弃时,只有13个data-vr-contentbox个实例。

有很多关于处理它的帖子。您可以从此问题中使用的方法开始:Scraping Javascript driven web pages with PyQt4 - how to access pages that need authentication?

相关问题