3种爬取在其中数据信息的方式

2020年5月10日 评论 105

3种爬取在其中数据信息的方式

3种爬取在其中数据信息的方式 。最先是正则表达式,随后是时兴的BeautifulSoup控制模块,最终是强劲的lxml控制模块。

1 正则表达式

假如你对正则表达式还不了解,或者必须一些提醒,那麼你能查看https://docs.python.org/2/howto/regex.html得到详细详细介绍。即便你应用过别的计算机语言的正则表达式,我本来可以强烈推荐你一步一步温馨一下Python中正则表达式的书写。

因为各章上都将会搭建或应用前边章节目录的內容,因而我建议你依照相近这书代码库的文档构造开展配备。全部编码都能够从代码库的code文件目录中运作,便于导进工作中一切正常。假如你期待建立一个不一样的构造,一定要注意必须变动全部来源于别的章的导进实际操作(例如以下编码中的from chp1.advanced_link_crawler)。

在我们应用正则表达式爬取國家(或地域)总面积数据信息时,最先必须试着配对``原素中的內容,以下图示。

>>> import re>>> from chp1.advanced_link_crawler import download>>> url = 'http://example.python-scraping.com/view/UnitedKingdom-239'>>> html = download(url)>>> re.findall(r'(.*?)', html)['<img />', '244,820 square kilometres', '62,348,447', 'GB', 'United Kingdom', 'London', '<a>EU</a>', '.uk', 'GBP', 'Pound', '44', '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA', '^(([A-Z]d{2}[A-Z]{2})|([A-Z]d{3}[A-Z]{2})|([A-Z]{2}d{2} [A-Z]{2})|([A-Z]{2}d{3}[A-Z]{2})|([A-Z]d[A-Z]d[A-Z]{2}) |([A-Z]{2}d[A-Z]d[A-Z]{2})|(GIR0AA))$', 'en-GB,cy-GB,gd', '<div><a>IE </a></div>']

从所述結果中能够看得出,好几个國家(或地域)特性都应用了``标识。如果我们只为爬取國家(或地域)总面积,能够只挑选第二个配对的原素,以下图示。

>>> re.findall('(.*?)', html)[1]'244,820 square kilometres'

尽管现在可以应用这一计划方案,可是假如网页页面产生变化,该计划方案很可能便会无效。例如报表发生了转变,去除开第二个配对原素中的总面积数据信息。如果我们只在时下爬取数据信息,就可以忽视这类将来将会产生的转变。可是,如果我们期待在未来某一時刻可以再度爬取该数据信息,就必须得出更为健硕的解决方法,进而尽量防止这类合理布局转变所产生的危害。要想该正则表达式更为确立,我们可以将父亲原素``也添加进去,因为该原素具备ID特性,因此应该是唯一的。

>>> re.findall('<label for="places_area">Area: </label>(.*?)', html)['244,820 square kilometres']

这一迭代更新版本号看上去更强一些,可是网页更新也有许多别的方法,一样能够让该正则表达式不能满足。例如,将双引号变成单引号,`标识中间加上不必要的空格符,或者变动area_label`等。下边是试着适用这种概率的改善版本号。

>>> re.findall('''.*?<tds>(.*?)''', html)['244,820 square kilometres']

尽管该正则表达式更非常容易融入将来转变,但又存有无法结构、易读性差的难题。除此之外,也有许多别的细微的合理布局转变也会使该正则表达式不能满足,例如在`标识里加上title特性,或是tr、td`原素改动了他们的CSS类或ID。

从本例中能够看得出,正则表达式为大家出示了爬取数据信息的快捷方式图标,可是该方式 过度敏感,非常容易在网页更新后出現难题。幸亏,也有更强的数据抽取解决方法,例如大家将在这章详细介绍的别的爬取库。

2 Beautiful Soup

Beautiful Soup

是一个十分时兴的Python库,它能够分析网页页面,并出示了精准定位內容的方便快捷插口。假如你都还没安裝该控制模块,能够应用下边的指令安裝其最新版。

pip install beautifulsoup4

应用Beautiful Soup的第一步是将已下载的HTML內容分析为soup文档。因为很多网页页面也不具有优良的HTML文件格式,因而Beautiful Soup必须对其标识开闭情况开展调整 。比如,在下面这一简单网页的目录中,存有特性值两边冒号缺少和标识未合闭的难题。

<ul> <li>Area </li><li>Population</li></ul>

假如Population目录项被分析为Area目录项的子原素,而不是并排的2个目录项得话,我们在爬取时便会获得不正确的結果。下边我们一起看一下Beautiful Soup是如何处理的。

>>> from bs4 import BeautifulSoup>>> from pprint import pprint>>> broken_html = '<ul><li>Area</li><li>Population</li></ul>'>>> # parse the HTML>>> soup = BeautifulSoup(broken_html, 'html.parser')>>> fixed_html = soup.prettify()>>> pprint(fixed_html)<ul> <li> Area </li><li> Population </li></ul>

我们可以见到,应用默认设置的html.parser并沒有获得恰当分析的HTML。从前边的编码精彩片段能够看得出,因为它应用了嵌套循环的li原素,因而将会会造成精准定位艰难。幸运的是,大家也有别的在线解析能够挑选。我们可以安裝LXML(2.2.3节里将会详解),或应用html5lib。要想安裝html5lib,只需应用pip。

pip install html5lib

如今,我们可以反复这一段编码,只对在线解析做以下变动。

>>> soup = BeautifulSoup(broken_html, 'html5lib')>>> fixed_html = soup.prettify()>>> pprint(fixed_html) <ul> <li> Area </li> <li> Population </li> </ul>

这时,应用了html5lib的BeautifulSoup早已可以恰当分析缺少的特性冒号及其合闭标识,而且还加上了和标识,使其变成详细的HTML文本文档。如果你应用lxml时,还可以见到相近的結果。

如今,我们可以应用find()和find_all()方式 来精准定位大家必须的原素了。

>>> ul = soup.find('ul', attrs={'class':'country_or_district'})>>> ul.find('li') # returns just the first match<li>Area</li>>>> ul.find_all('li') # returns all matches[<li>Area</li>, <li>Population</li>

要想掌握能用方式 和主要参数的详细目录,请浏览Beautiful Soup的官方网文本文档。

下边是应用该方式 提取实例网址中国家(或地域)总面积数据信息的详细编码。

>>> from bs4 import BeautifulSoup>>> url = 'http://example.python-scraping.com/places/view/United-Kingdom-239'>>> html = download(url)>>> soup = BeautifulSoup(html)>>> # locate the area row>>> tr = soup.find(attrs={'id':'places_area__row'})>>> td = tr.find(attrs={'class':'w2p_fw'}) # locate the data element>>> area = td.text # extract the text from the data element>>> print(area)244,820 square kilometres

这一段编码尽管比正则表达式的编码更为繁杂,但又更非常容易结构和了解。并且,像不必要的空格符和标识特性这类合理布局上的小转变,大家也不用再担忧了。大家还了解即便网页页面中包括了不详细的HTML,Beautiful Soup也能帮助我们梳理该网页页面,进而我们一起能够从十分不详细的网站源代码中提取数据信息。

3 Lxml

Lxml

是根据libxml2这一XML分析库搭建的Python库,它应用C语言撰写,分析速率比Beautiful Soup更快,但是安裝全过程也更加繁杂,尤其是在Windows中。全新的安裝表明能够参照http://lxml.de/installation.html。假如你一直在自主安裝该库时碰到困难,还可以应用Anaconda来完成。

你将会对Anaconda不太熟,它是由Continuum Analytics公司职员建立的关键致力于开源系统计算机科学包的包和自然环境管理工具。你能依照其安裝表明免费下载及安裝Anaconda。必须留意的是,应用Anaconda的迅速安裝会将你的PYTHON_PATH设定为Conda的Python安裝部位。

和Beautiful Soup一样,应用lxml控制模块的第一步也是将有可能不合理合法的HTML分析为统一文件格式。下边是应用该控制模块分析同一个不详细HTML的事例。

>>> from lxml.html import fromstring, tostring>>> broken_html = '<ul><li>Area</li><li>Population</li></ul>'>>> tree = fromstring(broken_html) # parse the HTML>>> fixed_html = tostring(tree, pretty_print=True)>>> print(fixed_html)<ul> <li>Area</li> <li>Population</li></ul>

一样地,lxml还可以恰当分析特性两边缺少的冒号,并合闭标识,但是该控制模块沒有附加加上和标识。这种都并不是规范XML的规定,因而针对lxml而言,插进他们并并不是必需的。

分析完键入內容以后,进到挑选原素的流程,这时lxml有几种不一样的方式 ,例如XPath选择符和相近Beautiful Soup的find()方式 。但是,在本例中,大家可能应用CSS选择符,因为它更为简约,而且可以在第五章分析动态性內容时足以重复使用。一些阅读者将会因为她们在jQuery选择符层面的工作经验或者前端开发Web应用程序开发中的应用对他们早已有一定的了解。在这章的事后一部分,大家将比照这种选择符与XPath的特性。要想应用CSS选择符,你将会必须先安裝cssselect库,以下图示。

pip install cssselect

如今,我们可以应用lxml的CSS选择符,提取实例网页页面中的总面积数据信息了。

>>> tree = fromstring(html)&g
t;>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]>>> area = td.text_content()>>> print(area)244,820 square kilometres

根据对编码树应用cssselect方式 ,我们可以运用CSS英语的语法来挑选报表中ID为places_area__row的行原素,随后是类为w2p_fw的子表格数据标识。因为cssselect回到的是一个目录,大家必须获得在其中的第一个結果,并启用text_content方式 ,以迭代更新全部子原素并回到每一个原素的有关文字。在本例中,虽然大家只有一个原素,可是该作用针对更为繁杂的提取实例而言十分有效。

  • 本文由 发表于 2020年5月10日
  • 转载请注意本文链接:http://www.wf-seo.com/haowen/19915.html
买个车怎么赚钱(用车赚钱的项目大全) 好文欣赏

买个车怎么赚钱(用车赚钱的项目大全)

购车许多 情况下是以便可以让自身的交通出行越来越更为的便捷,便捷。伴随着如今汽车销售量的增加,大城市也越来越拥挤不堪入目,许多人却挑选把车放到家中没去开,好在的是如今让轿车生钱的方法還是许多 的。 从...
2019什么年属什么生肖,2019什么属相! 好文欣赏

2019什么年属什么生肖,2019什么属相!

今年是2019年,什么猪?依照10大天干地支12地支,今年在阴历是已亥年。12生肖轮着做庄,即然总算到2019年,就该猪儿昂首阔步,颐指气使,进而身价倍增,狂扫一切。 結果在今年2019年里,起先非洲...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: