真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python爬蟲(chóng)網(wǎng)頁(yè),解析工具lxml.html(一)

狹義上講,爬蟲(chóng)只負(fù)責(zé)抓取,也就是下載網(wǎng)頁(yè)。而實(shí)際上,爬蟲(chóng)還要負(fù)責(zé)從下載的網(wǎng)頁(yè)中提取我們想要的數(shù)據(jù),即對(duì)非結(jié)構(gòu)化的數(shù)據(jù)(網(wǎng)頁(yè))進(jìn)行解析提取出結(jié)構(gòu)化的數(shù)據(jù)(有用數(shù)據(jù))。比如,我們要抓取了一個(gè)新聞頁(yè)面的網(wǎng)頁(yè)(html)下來(lái),但我們想要的是這個(gè)網(wǎng)頁(yè)中關(guān)于新聞的結(jié)構(gòu)化數(shù)據(jù):新聞的標(biāo)題、新聞的發(fā)布時(shí)間、新聞的正文等。

十年的漢中網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整漢中建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“漢中網(wǎng)站設(shè)計(jì)”,“漢中網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

Python 爬蟲(chóng)網(wǎng)頁(yè),解析工具lxml.html(一)

所以說(shuō),網(wǎng)頁(yè)下載下來(lái)只是第一步,還有重要的一步就是數(shù)據(jù)提取。不同的爬蟲(chóng)想要的數(shù)據(jù)不一樣,提取的數(shù)據(jù)也就不一樣,但提取方法都是類似的。

最簡(jiǎn)單的提取數(shù)據(jù)的方法,就是使用正則表達(dá)式,此種方法簡(jiǎn)單,提取的邏輯也不能復(fù)雜,不然寫出的正則表達(dá)式就晦澀難懂,甚至不能提取復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

經(jīng)過(guò)多年的使用經(jīng)驗(yàn),選擇了lxml和xpath來(lái)解析網(wǎng)頁(yè)提取結(jié)構(gòu)化數(shù)據(jù)。順便說(shuō)一下 BeautifulSoup,它也是一個(gè)很棒的解析HTML的工具,可以使用多個(gè)解析器,比如Python標(biāo)準(zhǔn)庫(kù)的parser,但是速度比較慢,也可以使用lxml作為解析器,但是它的使用方法、API跟lxml不太一樣。使用下來(lái),還是lxml的API更舒服。

lxml 對(duì)C語(yǔ)言庫(kù) libxml2和 libxslt進(jìn)行綁定,提供了Pythonic的API,它有一些主要特點(diǎn):

  • 支持標(biāo)準(zhǔn)的XML
  • 支持(損壞)的HTML
  • 非常快的解析速度
  • Pythonic的API更易于使用
  • 使用Python的unicode字符串
  • 內(nèi)存安全(沒(méi)有段錯(cuò)誤)
  • 不需要手動(dòng)管理內(nèi)存

總結(jié)為一句話就是,C語(yǔ)言的速度和Python的簡(jiǎn)易相結(jié)合的神器。

lxml有兩大部分,分別支持XML和HTML的解析:

  • lxml.etree 解析XML
  • lxml.html 解析html

lxml.etree可以用來(lái)解析RSS feed,它就是一個(gè)XML格式的文檔。然而爬蟲(chóng)抓取的絕大部分都是html網(wǎng)頁(yè),所以,我們這里主要講述lxml.html解析網(wǎng)頁(yè)的方法。

lxml.html 從html字符串生成文檔樹(shù)結(jié)構(gòu)

我們下載得到的網(wǎng)頁(yè)就是一串html字符串,如何把它輸入給lxml.html模塊,從而生成html文檔的樹(shù)結(jié)構(gòu)呢?
該模塊提供了幾種不同的方法:

  • parse(filename_url_or_file):
    輸入的是一個(gè)文件名、URL或文件對(duì)象(有read()方法)。
  • document_fromstring(string):
    輸入的是一個(gè)html的字符串,創(chuàng)建一個(gè)HTML文檔樹(shù)結(jié)構(gòu),它的根節(jié)點(diǎn)就是, 和 子節(jié)點(diǎn)。
  • fragment_fromstring(string, create_parent=False):
    返回輸入字符串的HTML片段。這個(gè)片段壁紙只含有一個(gè)element(元素),也就是單一節(jié)點(diǎn),除非給出了create_parent 參數(shù),否則會(huì)報(bào)錯(cuò)。
  • fragments_fromstring(string):
    返回包含輸入字符串中所有片段的列表。
  • fromstring(string):
    返回值依據(jù)輸入字符串而定,如果輸入看起來(lái)像是一個(gè)文檔,則返回 document_fromstring(string) ,如果是一個(gè)單一片段,則返回 fragment_fromstring(string) 。

下面我們通過(guò)具體示例來(lái)說(shuō)明上面幾個(gè)方法的不同。

document_fromstring 的使用方法

In [1]: import lxml.html  as lh
In [2]: z = lh.document_fromstring('abcxyz')
# 可以看到,它自動(dòng)加了根節(jié)點(diǎn)
In [3]: z
Out[3]: 
In [4]: z.tag
Out[4]: 'html'
# 還加了節(jié)點(diǎn)
In [5]: z.getchildren()
Out[5]: []
# 把字符串的兩個(gè)節(jié)點(diǎn)放在了里面
In [6]: z.getchildren()[0].getchildren()
Out[6]: []

fragment_fromstring 的使用

In [11]: z = lh.fragment_fromstring(‘
abc
xyz
’) --------------------------------------------------------------------------- ParserError                               Traceback (most recent call last)  in () ----> 1 z = lh.fragment_fromstring(‘
abc
xyz
’) ~/.virtualenvs/py3.6/lib/python3.6/site-packages/lxml/html/__init__.py in fragment_fromstring(html, create_parent, base_url, parser, **kw)     850         raise etree.ParserError(     851             “Multiple elements found (%s)” --> 852             % ‘, ‘.join([_element_name(e) for e in elements]))     853     el = elements[0]     854     if el.tail and el.tail.strip(): ParserError: Multiple elements found (div, div) # 可以看到,輸入是兩個(gè)節(jié)點(diǎn)(element)時(shí)就會(huì)報(bào)錯(cuò) # 如果加上 create_parent 參數(shù),就沒(méi)問(wèn)題了 In [12]: z = lh.fragment_fromstring('
abc
xyz
', create_parent='p') In [13]: z.tag Out[13]: 'p' In [14]: z.getchildren() Out[14]: []

fragments_fromstring 的使用

# 輸入字符串含有一個(gè)節(jié)點(diǎn),則返回包含這一個(gè)節(jié)點(diǎn)的列表
In [17]: lh.fragments_fromstring('
abc
') Out[17]: [] # 輸入字符串含有多個(gè)節(jié)點(diǎn),則返回包含這多個(gè)節(jié)點(diǎn)的列表 In [18]: lh.fragments_fromstring('
abc
xyz
') Out[18]: []

fromstring 的使用

In [27]: z = lh.fromstring('
abc
xyz
') In [28]: z Out[28]:  In [29]: z.getchildren() Out[29]: [] In [30]: type(z) Out[30]: lxml.html.HtmlElement

這里,fromstring輸入的如果是多個(gè)節(jié)點(diǎn),它會(huì)給加一個(gè)父節(jié)點(diǎn)并返回。但是像html網(wǎng)頁(yè)都是從節(jié)點(diǎn)開(kāi)始的,我們使用fromstring() 和 document_fromstring() 都可以得到完整的網(wǎng)頁(yè)結(jié)構(gòu)。

從上面代碼中我們可以看到,那幾個(gè)函數(shù)返回的都是HtmlElement對(duì)象,也就是說(shuō),我們已經(jīng)學(xué)會(huì)了如何從html字符串得到HtmlElement的對(duì)象,下一節(jié)我們將學(xué)習(xí)如何操作HtmlElement對(duì)象,從中提取我們感興趣的數(shù)據(jù)。


分享題目:Python爬蟲(chóng)網(wǎng)頁(yè),解析工具lxml.html(一)
文章鏈接:http://weahome.cn/article/jicipp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部