用Python写网络爬虫系列(二)------数据获取

在系列(一)中我们已经知道了怎么样去访问一个网站,我们写爬虫的目的是什么?就是为了获取数据。那么知道怎么样把网页下载下来之后我们进一步的要对网站上的数据进行采集。我使用的工具主要有三个,正则表达式、lxml、Beautifulsoup 

目标网站以及目标数据:http://example.webscraping.com/view/United-Kingdom-239 数据:这个国家的国土面积是多少?

        踩点: 我们先看看这个网站的大体情况

  

我们所需要的数据在Area:后面选中之后直接用chrome浏览器的审查元素来查看他的位置 :


在了解了这些之后我们就可以开始我们的采集数据的函数编写:

     1:正则表达式 :首先贴上代码:

import re
def scrape(html):
    area = re.findall('<tr id="places_area__row">.*?<td\s*class=["\']w2p_fw["\']>(.*?)</td>', html)[0]
首先导入 正则表达式模块,定义函数时候我选择参数为我们已经下载的网页,看正则表达式 这里的正则定义的两个部分的内容,第一个是找到所有的class为 w2p_fw的标签,我在前面又加了一个tr是为了防止后面的td改变以后不容易再找到。增强了查找能力

   2:BeautifulSoup:

from bs4 import BeautifulSoup

def soup(html):
    soup = BeautifulSoup(html,'lxml')
    tr = soup.find(attrs={'id':'places_area__row'})
    td=tr.find(attrs={'class':'w2p_fw'})
    area=td.text
    print area
之前就有用过Beautifulsoup今天再次使用又得到了一些新的东西吧。整个的过程就是把网页转换成BeautifulSoup对象,然后再根据soup的find 方法找到所对应的标签,这里是根据ID号来查找,其实还有另外一种方式 soup.find(tr,xx)xx代表类名等等,可以尝试一下。soup还有一个方法是find_all返回值是一个list 。值得注意的是可以直接取到文本内容也就是td.text方法来直接取文本,否则直接输出td会连带有标签 

 BeautifulSoup文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/

3:lxml

   Anaconda里面只有lxml.html我们在使用lxml包进行访问的时候需要加载另一个cssselect 需要先安装;贴上代码:

def Lxml(html):
    tree = lxml.html.fromstring(html)
    td=tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
    area=td.text
    print  area

 这里的整个过程有点像BeautifulSoup的过程。只不过后面用了css选择器。这个路径是怎么获得的?Chrome同样可以帮助我们得到,其他一些主流浏览器现在也能:


选中之后找到selector点击,这样整个路径就在你的黏贴板上了,还可以手动输入但是比较麻烦:


这里一个一个一个的打下去一层层往下的时候使用">"符号进行向下

 以上就是三种方法,全部实现的代码:

import urllib2
import re
import lxml.cssselect
import lxml.html
from bs4 import BeautifulSoup
def scrape(html):
    area = re.findall('<tr id="places_area__row">.*?<td\s*class=["\']w2p_fw["\']>(.*?)</td>', html)[0]
def soup(html):
    soup = BeautifulSoup(html,'lxml')
    tr = soup.find(attrs={'id':'places_area__row'})
    td=tr.find(attrs={'class':'w2p_fw'})
    area=td.text
    print area
def Lxml(html):
    tree = lxml.html.fromstring(html)
    td=tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
    area=td.text
    print  area
if __name__ == '__main__':
    html = urllib2.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
    print scrape(html)
    soup(html)
    Lxml(html)
以上


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值