python-70:使用BS4获取正文内容

上一小节我们学习了find 和 find_all 函数,我们也知道find_all 函数返回的结果是一个列表,然而我们并不想要列表,列表不利于我们查看,所以我们只能使用find,find会将匹配的结果直接返回,那么find()函数有这么多参数,name,keyword,attrs,text,recursive,我们需要使用哪个参数呢?

我们来看看网页源码

 <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
  <div class="section" id="beautiful-soup-4-2-0">
<h1>Beautiful Soup 4.2.0 文档<a class="headerlink" href="#beautiful-soup-4-2-0" title="永久链接至标题">¶</a></h1>
<img alt="http://www.crummy.com/software/BeautifulSoup/bs4/doc/_images/6.1.jpg" class="align-right" src="http://www.crummy.com/software/BeautifulSoup/bs4/doc/_images/6.1.jpg" />
<p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.</p>
<p>这篇文档介绍了BeautifulSoup4中所有主要特性,并切有小例子.让我来向你展示它适合做什么,如何工作,怎样使用,如何达到你想要的效果,和处理异常情况.</p>
<p>文档中出现的例子在Python2.7和Python3.2中的执行结果相同</p>
<p>你可能在寻找 <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup3</a> 的文档,Beautiful Soup 3 目前已经停止开发,我们推荐在现在的项目中使用Beautiful Soup 4, <a class="reference external" href="http://www.baidu.com">移植到BS4</a></p>
<div class="section" id="id1">
<h2>寻求帮助<a class="headerlink" href="#id1" title="永久链接至标题">¶</a></h2>
<p>如果你有关于BeautifulSoup的问题,可以发送邮件到 <a class="reference external" href="https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup">讨论组</a> .如果你的问题包含了一段需要转换的HTML代码,那么确保你提的问题描述中附带这段HTML文档的 <a class="reference internal" href="#id60">代码诊断</a> <a class="footnote-reference" href="#id83" id="id3">[1]</a></p>
</div>
</div>

这是网页源码中正文开始的部分,我们看到,有<h1>标签,这是标题,还有<p>标签,这是段落,里面则是文章的内容,当然,这只是其中很小很小的部分,我们想要获取这些内容,需要传入find函数的哪个参数呢?我们来一个一个的分析,顺便加深印象

  1. name :name参数是针对tag进行操作的,我们想要获取全部的正文内容的话,就要分别对<h1>,<p>,<li>等标签进行获取,当然肯定还会有其他的标签,find('h1')是获取所有<h1>标签的内容,其他的也一样,所以我们在输出的时候还需要对结果进行整合,这个相当麻烦,根本分不清哪个标题对应那段文字,所以这个 pass

  2. keyword:keyword据说是可以按tag标签的属性进行查找,那我这里可以找到整个正文内容包含在哪个代码块中,可能是class="xxxbody" 或者 id="xxx"等等,我可以使用这个参数将整个正文所在的代码块抠出来,这样章节的顺序是不会变化的,这个方法好像可行,但是我们再看看还有没有更好的方法

  3. attrs:attrs是针对于匹配一些与关键字相同的字符串,比如import,class等等,这里应该是用不到的

  4. text:啊,这个根本是想都不用想的好嘛,这个是根据text的字符串来寻找相对应的内容,我们要传一个字符串进去,然后find函数会寻找含有这个字符串的句子,这完全跟我们要实现的功能不搭调的

  5. recursive:这个参数设置是否遍历某个tag的所有子孙节点,这个好像可以使用,我们只要传入一个tag就可以了嘛,但前提是,你的这个tag必须是唯一的,我们现在这个网页源码中,正文内容的父节点的tag是<div>,可是,源码中还有很多的<div>,我们将这个tag传进去的话程序并不知道我们要寻找的是哪个<div>里面的子孙节点,程序运行不能达到我们想要的效果

所以没办法了,只能使用第二个参数了,现在的问题是,应该传入什么keyword

通过对源码的分析,我觉得这句代码很有可能

<div itemprop="articleBody">

这个articleBody 的英文看起来好像是文章主题的意思,而且,一般规范的程序为了便于后面的修改和维护,它的函数名或者是关键字都会以相关功能的英文名字来命名,这是阅读程序的一个小技巧,我觉得这个articleBody有可能就是我们要的,所以将代码整理一下,看看结果是什么吧

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = '217小月月坑'

'''
获取文章主体
'''

import urllib2
from bs4 import BeautifulSoup

url = 'http://beautifulsoup.readthedocs.org/zh_CN/latest/#'
request = urllib2.Request(url)
response = urllib2.urlopen(request)
contents = response.read()
soup = BeautifulSoup(contents)
# 传入keyword参数
result = soup.find(itemprop="articleBody")
print result

输出结果

085459_MikM_2429887.png

好了,结果证明正文部分的代码已经被抠出来了,但是,我们不能就这样将结果直接写入文件,我们还要从这段源码中获取正文的内容,也就是那些文字什么的,那好,我们就来看一下应该使用什么方法来获取正文的内容

转载于:https://my.oschina.net/u/2429887/blog/596550

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值