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