稍微复杂一点的例子

v2ex主页的右侧一般有个最热主题区域,里面列出了当日的热门讨论话题。这一节里我们就尝试使用爬虫技术获取这些热门主题文本和链接。

注意:v2ex本身提供了接口去获取这些热门主题的详细信息,本节内容只是举例,并不是最佳实践

具体步骤

  • 访问v2ex主页,获取html文本
  • 分析html文本,找出待获取内容的特征
  • 解析html代码,根据特征拿出目标内容
  • 打印这些内容

分析html代码

热门内容部分的html代码如下所示

<span class="item_hot_topic_title">
  <a href="/t/415664">冬天了,身上静电咋处理?</a>
</span>

可以看出我们要找到的是所有class=item_hot_topic_title的span下面的a元素

代码

新建名为v2ex_hosts.py的文件,输入下面的内容


import requests
from bs4 import BeautifulSoup

url = 'https://www.v2ex.com/'
soup = BeautifulSoup(requests.get(url).text, 'html.parser')

for span in soup.find_all('span', class_='item_hot_topic_title'):
    print(span.find('a').text, span.find('a')['href'])

运行

在命令行中输入

python v2ex_hosts.py

预期结果

如果一切正常,那么应该可以看到类似下面的结果,由于每天的热门主题不一样,所以内容是会变化的

小米感恩节不感恩 /t/415623
冬天了,身上静电咋处理? /t/415664
违反一下政治正确,骂一下 Google /t/415600
做了将近 6 年程序员,没能成为大牛,考虑再三,决定改行,大家说,做点什么好呢? /t/415701
结果还是被雷猴王给套路了 /t/415843
一直很好奇 Mac+安卓的组合是基于什么优势考虑的呢? /t/415645
听说比特币要分叉了? /t/415858
看到大学同学朋友圈发的北大成人通知书,心里不是滋味。 /t/415821
当码农 8 年了,要不要去读个研 /t/415854
新进一家公司遭遇的待遇~~ /t/415863

我们可以学到什么

  • for span in soup.find_all('span', class_='item_hot_topic_title'): 遍历所有的class=item_hot_topic_title的span。注意是class_,不是class,因为class是python的关键字,所以后面要加个尾巴,防止冲突

  • span.find('a').text:层级遍历,先找到span,再从span下找到a,这是常用套路

  • span.find('a')['href']:获取href属性,在bs4里,我们可以通过[attribute_name]的方式来获取元素的属性

阅读内容

BeautifulSoup