摘要:上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)與正則表達(dá)式抓取貓眼電影排行下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)解析庫的使用上一節(jié)我們實現(xiàn)了一個最基本的爬蟲,但提取頁面信息時我們使用的是正則表達(dá)式,用過之后我們會發(fā)現(xiàn)構(gòu)造一個正則表達(dá)式還是比較的繁瑣的,而且萬一有一點地
上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼電影排行
下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---29、解析庫的使用:BeautifulSoup
上一節(jié)我們實現(xiàn)了一個最基本的爬蟲,但提取頁面信息時我們使用的是正則表達(dá)式,用過之后我們會發(fā)現(xiàn)構(gòu)造一個正則表達(dá)式還是比較的繁瑣的,而且萬一有一點地方寫錯了就可能會導(dǎo)致匹配失敗,所以使用正則來提取頁面信息多多少少還是有些不方便的。
對于網(wǎng)頁的節(jié)點來說,它可以定義 id、class 或其他的屬性,而且節(jié)點之間還具有層次關(guān)系,在網(wǎng)頁中可以通過 XPath 或 CSS 選擇器來定位一個或多個節(jié)點。那么在頁面解析時,我們利用 XPath 或 CSS 選擇器來提取到某個節(jié)點,然后再調(diào)用相應(yīng)的方法去獲取它的正文內(nèi)容或者屬性不就可以提取我們想要的任意信息了嗎?
在 Python 中,我們怎樣來實現(xiàn)這個操作呢?不用擔(dān)心,這種解析庫已經(jīng)非常多了,其中比較強(qiáng)大的庫有 LXML、BeautifulSoup、PyQuery 等等,本章我們就來介紹一下這三個解析庫的使用,有了它們,我們不用再為正則發(fā)愁,而且解析效率也會大大提高,實為爬蟲必備利器。
XPath的使用XPath,全稱 XML Path Language,即 XML 路徑語言,它是一門在XML文檔中查找信息的語言。XPath 最初設(shè)計是用來搜尋XML文檔的,但是它同樣適用于 HTML 文檔的搜索。
所以在做爬蟲時,我們完全可以使用 XPath 來做相應(yīng)的信息抽取,本節(jié)我們來介紹一下 XPath 的基本用法。
1. XPath概覽XPath 的選擇功能十分強(qiáng)大,它提供了非常簡潔明了的路徑選擇表達(dá)式,另外它還提供了超過 100 個內(nèi)建函數(shù)用于字符串、數(shù)值、時間的匹配以及節(jié)點、序列的處理等等,幾乎所有我們想要定位的節(jié)點都可以用XPath來選擇。
XPath 于 1999 年 11 月 16 日 成為 W3C 標(biāo)準(zhǔn),它被設(shè)計為供 XSLT、XPointer 以及其他 XML 解析軟件使用,更多的文檔可以訪問其官方網(wǎng)站:https://www.w3.org/TR/xpath/。
2. XPath常用規(guī)則我們現(xiàn)用表格列舉一下幾個常用規(guī)則:
表達(dá)式 | 描述 |
---|---|
nodename | 選取此節(jié)點的所有子節(jié)點 |
/ | 從當(dāng)前節(jié)點選取直接子節(jié)點 |
// | 從當(dāng)前節(jié)點選取子孫節(jié)點 |
. | 選取當(dāng)前節(jié)點 |
.. | 選取當(dāng)前節(jié)點的父節(jié)點 |
@ | 選取屬性 |
在這里列出了XPath的常用匹配規(guī)則,例如 / 代表選取直接子節(jié)點,// 代表選擇所有子孫節(jié)點,. 代表選取當(dāng)前節(jié)點,.. 代表選取當(dāng)前節(jié)點的父節(jié)點,@ 則是加了屬性的限定,選取匹配屬性的特定節(jié)點。
例如:
//title[@lang=’eng’]
這就是一個 XPath 規(guī)則,它就代表選擇所有名稱為 title,同時屬性 lang 的值為 eng 的節(jié)點。
在后文我們會介紹 XPath 的詳細(xì)用法,通過 Python 的 LXML 庫利用 XPath 進(jìn)行 HTML 的解析。
3. 準(zhǔn)備工作在使用之前我們首先要確保安裝好了 LXML 庫,如沒有安裝可以參考第一章的安裝過程。
4. 實例引入我們現(xiàn)用一個實例來感受一下使用 XPath 來對網(wǎng)頁進(jìn)行解析的過程,代碼如下:
from lxml import etree text = """ """ html = etree.HTML(text) result = etree.tostring(html) print(result.decode("utf-8"))
在這里我們首先導(dǎo)入了 LXML 庫的 etree 模塊,然后聲明了一段 HTML 文本,調(diào)用 HTML 類進(jìn)行初始化,這樣我們就成功構(gòu)造了一個 XPath 解析對象,在這里注意到 HTML 文本中的最后一個 li 節(jié)點是沒有閉合的,但是 etree 模塊可以對 HTML 文本進(jìn)行自動修正。
在這里我們調(diào)用 tostring() 方法即可輸出修正后的 HTML 代碼,但是結(jié)果是 bytes 類型,在這里我們利用 decode() 方法轉(zhuǎn)成 str 類型,結(jié)果如下:
我們可以看到經(jīng)過處理之后 li 節(jié)點標(biāo)簽被補(bǔ)全,并且還自動添加了 body、html 節(jié)點。
另外我們也可以直接讀取文本文件進(jìn)行解析,示例如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = etree.tostring(html) print(result.decode("utf-8"))
其中 test.html 的內(nèi)容就是上面例子中的 HTML 代碼,內(nèi)容如下:
這次的輸出結(jié)果略有不同,多了一個 DOCTYPE 的聲明,不過對解析無任何影響,結(jié)果如下:
5. 所有節(jié)點
我們一般會用 // 開頭的 XPath 規(guī)則來選取所有符合要求的節(jié)點,以上文的 HTML 文本為例,如果我們要選取所有節(jié)點,可以這樣實現(xiàn):
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://*") print(result)
運行結(jié)果:
[, , , , , , , , , , , , , ]
我們在這里使用 * 代表匹配所有節(jié)點,也就是整個 HTML 文本中的所有節(jié)點都會被獲取,可以看到返回形式是一個列表,每個元素是 Element 類型,其后跟了節(jié)點的名稱,如 html、body、div、ul、li、a 等等,所有的節(jié)點都包含在列表中了。
當(dāng)然此處匹配也可以指定節(jié)點名稱,如果我們想獲取所有 li 節(jié)點,示例如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li") print(result) print(result[0])
在這里我們要選取所有 li 節(jié)點可以使用 //,然后直接加上節(jié)點的名稱即可,調(diào)用時直接調(diào)用 xpath() 方法即可提取。
運行結(jié)果:
[, , , , ]
在這里我們可以看到提取結(jié)果是一個列表形式,其每一個元素都是一個 Element 對象,如果要取出其中一個對象可以直接用中括號加索引即可取出,如 [0]。
6. 子節(jié)點我們通過 / 或 // 即可查找元素的子節(jié)點或子孫節(jié)點,加入我們現(xiàn)在想選擇 li 節(jié)點所有直接 a 子節(jié)點,可以這樣來實現(xiàn):
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li/a") print(result)
在這里我們通過追加一個 /a 即選擇了所有 li 節(jié)點的所有直接 a 子節(jié)點,因為 //li 是選中所有l(wèi)i節(jié)點, /a 是選中l(wèi)i節(jié)點的所有直接子節(jié)點 a,二者組合在一起即獲取了所有l(wèi)i節(jié)點的所有直接 a 子節(jié)點。
運行結(jié)果:
[, , , , ]
但是此處的 / 是選取直接子節(jié)點,如果我們要獲取所有子孫節(jié)點就該使用 // 了,例如我們要獲取 ul 節(jié)點下的所有子孫 a 節(jié)點,可以這樣來實現(xiàn):
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://ul//a") print(result)
運行結(jié)果是相同的。
但是這里如果我們用 //ul/a 就無法獲取任何結(jié)果了,因為 / 是獲取直接子節(jié)點,而在 ul 節(jié)點下沒有直接的 a 子節(jié)點,只有 li 節(jié)點,所以無法獲取任何匹配結(jié)果,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://ul/a") print(result)
運行結(jié)果:
[]
因此在這里我們要注意 / 和 // 的區(qū)別,/ 是獲取直接子節(jié)點,// 是獲取子孫節(jié)點。
7. 父節(jié)點我們知道通過連續(xù)的 / 或 // 可以查找子節(jié)點或子孫節(jié)點,那假如我們知道了子節(jié)點怎樣來查找父節(jié)點呢?在這里我們可以用 .. 來獲取父節(jié)點。
比如我們現(xiàn)在首先選中 href 是 link4.html 的 a 節(jié)點,然后再獲取其父節(jié)點,然后再獲取其 class 屬性,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://a[@href="link4.html"]/../@class") print(result)
運行結(jié)果:
["item-1"]
檢查一下結(jié)果,正是我們獲取的目標(biāo) li 節(jié)點的 class,獲取父節(jié)點成功。
同時我們也可以通過 parent:: 來獲取父節(jié)點,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://a[@href="link4.html"]/parent::*/@class") print(result)8. 屬性匹配
在選取的時候我們還可以用 @ 符號進(jìn)行屬性過濾,比如在這里如果我們要選取 class 為 item-1 的 li 節(jié)點,可以這樣實現(xiàn):
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li[@class="item-0"]") print(result)
在這里我們通過加入 [@class="item-0"] 就限制了節(jié)點的 class 屬性為 item-0,而 HTML 文本中符合條件的 li 節(jié)點有兩個,所以返回結(jié)果應(yīng)該返回兩個匹配到的元素,結(jié)果如下:
[, ]
可見匹配結(jié)果結(jié)果正是兩個,至于是不是那正確的兩個,我們在后面驗證一下。
9. 文本獲取我們用 XPath 中的 text() 方法可以獲取節(jié)點中的文本,我們接下來嘗試獲取一下上文 li 節(jié)點中的文本,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li[@class="item-0"]/text()") print(result)
運行結(jié)果如下:
[" "]
很奇怪的是我們并沒有獲取到任何文本,而是只獲取到了一個換行符,這是為什么呢?因為 XPath 中 text() 前面是 /,而此 / 的含義是選取直接子節(jié)點,而此處很明顯 li 的直接子節(jié)點都是 a 節(jié)點,文本都是在 a 節(jié)點內(nèi)部的,所以這里匹配到的結(jié)果就是被修正的 li 節(jié)點內(nèi)部的換行符,因為自動修正的li節(jié)點的尾標(biāo)簽換行了。
即選中的是這兩個節(jié)點:
其中一個節(jié)點因為自動修正,li 節(jié)點的尾標(biāo)簽添加的時候換行了,所以提取文本得到的唯一結(jié)果就是 li 節(jié)點的尾標(biāo)簽和 a 節(jié)點的尾標(biāo)簽之間的換行符。
因此,如果我們想獲取 li 節(jié)點內(nèi)部的文本就有兩種方式,一種是選取到 a 節(jié)點再獲取文本,另一種就是使用 //,我們來看下二者的區(qū)別是什么。
首先我們選取到 a 節(jié)點再獲取文本,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li[@class="item-0"]/a/text()") print(result)
運行結(jié)果:
["first item", "fifth item"]
可以看到這里返回值是兩個,內(nèi)容都是屬性為 item-0 的 li 節(jié)點的文本,這也印證了我們上文中屬性匹配的結(jié)果是正確的。
在這里我們是逐層選取的,先選取了 li 節(jié)點,又利用 / 選取了其直接子節(jié)點 a,然后再選取其文本,得到的結(jié)果恰好是符合我們預(yù)期的兩個結(jié)果。
我們再來看下用另一種方式 // 選取的結(jié)果,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li[@class="item-0"]//text()") print(result)
運行結(jié)果:
["first item", "fifth item", " "]
不出所料,這里返回結(jié)果是三個,可想而知這里是選取所有子孫節(jié)點的文本,其中前兩個就是 li 的子節(jié)點 a 節(jié)點內(nèi)部的文本,另外一個就是最后一個 li 節(jié)點內(nèi)部的文本,即換行符。
所以說,如果我們要想獲取子孫節(jié)點內(nèi)部的所有文本,可以直接用 // 加 text() 的方式獲取,這樣可以保證獲取到最全面的文本信息,但是可能會夾雜一些換行符等特殊字符。如果我們想獲取某些特定子孫節(jié)點下的所有文本,可以先選取到特定的子孫節(jié)點,然后再調(diào)用 text() 方法獲取其內(nèi)部文本,這樣可以保證獲取的結(jié)果是整潔的。
10. 屬性獲取我們知道了用 text() 可以獲取節(jié)點內(nèi)部文本,那么節(jié)點屬性該怎樣獲取呢?其實還是用 @ 符號就可以,例如我們想獲取所有 li 節(jié)點下所有 a 節(jié)點的 href 屬性,代碼如下:
from lxml import etree html = etree.parse("./test.html", etree.HTMLParser()) result = html.xpath("http://li/a/@href") print(result)
在這里我們通過 @href 即可獲取節(jié)點的 href 屬性,注意此處和屬性匹配的方法不同,屬性匹配是中括號加屬性名和值來限定某個屬性,如 [@href="link1.html"],而此處的 @href 指的是獲取節(jié)點的某個屬性,二者需要做好區(qū)分。
運行結(jié)果:
["link1.html", "link2.html", "link3.html", "link4.html", "link5.html"]
可以看到我們成功獲取了所有 li 節(jié)點下的 a 節(jié)點的 href 屬性,以列表形式返回。
11. 屬性多值匹配有時候某些節(jié)點的某個屬性可能有多個值,例如下面例子:
from lxml import etree text = """
在這里 HTML 文本中的 li 節(jié)點的 class 屬性有兩個值 li 和 li-first,但是此時如果我們還想用之前的屬性匹配獲取就無法匹配了,代碼運行結(jié)果:
[]
這時如果屬性有多個值就需要用 contains() 函數(shù)了,代碼可以改寫如下:
from lxml import etree text = """
這樣我們通過 contains() 方法,第一個參數(shù)傳入屬性名稱,第二個參數(shù)傳入屬性值,這樣只要此屬性包含所傳入的屬性值就可以完成匹配了。
運行結(jié)果:
["first item"]
此種選擇方式在某個節(jié)點的某個屬性有多個值的時候經(jīng)常會用到,如某個節(jié)點的 class 屬性通常有多個。
12. 多屬性匹配另外我們可能還遇到一種情況,我們可能需要根據(jù)多個屬性才能確定一個節(jié)點,這是就需要同時匹配多個屬性才可以,那么這里可以使用運算符 and 來連接,示例如下:
from lxml import etree text = """
在這里 HTML 文本的 li 節(jié)點又增加了一個屬性 name,這時候我們需要同時根據(jù) class 和 name 屬性來選擇,就可以 and 運算符連接兩個條件,兩個條件都被中括號包圍,運行結(jié)果如下:
["first item"]
這里的 and 其實是 XPath 中的運算符,另外還有很多運算符,如 or、mod 等等,在此總結(jié)如下:
運算符 | 描述 | 實例 | 返回值 |
---|---|---|---|
or | 或 | price=9.80 or price=9.70 | 如果 price 是 9.80,則返回 true。如果 price 是 9.50,則返回 false。 |
and | 與 | price>9.00 and price<9.90 | 如果 price 是 9.80,則返回 true。如果 price 是 8.50,則返回 false。 |
mod | 計算除法的余數(shù) | 5 mod 2 | 1 |
計算兩個節(jié)點集 | //book //cd | 返回所有擁有 book 和 cd 元素的節(jié)點集 | |
+ | 加法 | 6 + 4 | 10 |
- | 減法 | 6 - 4 | 2 |
* | 乘法 | 6 * 4 | 24 |
div | 除法 | 8 div 4 | 2 |
= | 等于 | price=9.80 | 如果 price 是 9.80,則返回 true。如果 price 是 9.90,則返回 false。 |
!= | 不等于 | price!=9.80 | 如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。 |
< | 小于 | price<9.80 | 如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。 |
<= | 小于或等于 | price<=9.80 | 如果 price 是 9.00,則返回 true。如果 price 是 9.90,則返回 false。 |
> | 大于 | price>9.80 | 如果 price 是 9.90,則返回 true。如果 price 是 9.80,則返回 false。 |
>= | 大于或等于 | price>=9.80 | 如果 price 是 9.90,則返回 true。如果 price 是 9.70,則返回 false。 |
此表參考來源:http://www.w3school.com.cn/xp...。
13. 按序選擇有時候我們在選擇的時候可能某些屬性同時匹配了多個節(jié)點,但是我們只想要其中的某個節(jié)點,如第二個節(jié)點,或者最后一個節(jié)點,這時該怎么辦呢?
這時可以利用中括號傳入索引的方法獲取特定次序的節(jié)點,示例如下:
from lxml import etree text = """ """ html = etree.HTML(text) result = html.xpath("http://li[1]/a/text()") print(result) result = html.xpath("http://li[last()]/a/text()") print(result) result = html.xpath("http://li[position()<3]/a/text()") print(result) result = html.xpath("http://li[last()-2]/a/text()") print(result)
第一次選擇我們選取了第一個 li 節(jié)點,中括號中傳入數(shù)字1即可,注意這里和代碼中不同,序號是以 1 開頭的,不是 0 開頭的。
第二次選擇我們選取了最后一個 li 節(jié)點,中括號中傳入 last() 即可,返回的便是最后一個 li 節(jié)點。
第三次選擇我們選取了位置小于 3 的 li 節(jié)點,也就是位置序號為 1 和 2 的節(jié)點,得到的結(jié)果就是前 2 個 li 節(jié)點。
第四次選擇我們選取了倒數(shù)第三個 li 節(jié)點,中括號中傳入 last()-2即可,因為 last() 是最后一個,所以 last()-2 就是倒數(shù)第三個。
運行結(jié)果如下:
["first item"] ["fifth item"] ["first item", "second item"] ["third item"]
在這里我們使用了 last()、position() 等函數(shù),XPath 中提供了 100 多個函數(shù),包括存取、數(shù)值、字符串、邏輯、節(jié)點、序列等處理功能,具體所有的函數(shù)作用可以參考:http://www.w3school.com.cn/xp...。
13. 節(jié)點軸選擇XPath 提供了很多節(jié)點軸選擇方法,英文叫做 XPath Axes,包括獲取子元素、兄弟元素、父元素、祖先元素等等,在一定情況下使用它可以方便地完成節(jié)點的選擇,我們用一個實例來感受一下:
from lxml import etree text = """ """ html = etree.HTML(text) result = html.xpath("http://li[1]/ancestor::*") print(result) result = html.xpath("http://li[1]/ancestor::div") print(result) result = html.xpath("http://li[1]/attribute::*") print(result) result = html.xpath("http://li[1]/child::a[@href="link1.html"]") print(result) result = html.xpath("http://li[1]/descendant::span") print(result) result = html.xpath("http://li[1]/following::*[2]") print(result) result = html.xpath("http://li[1]/following-sibling::*") print(result)
運行結(jié)果:
[, , , ] [ ] ["item-0"] [ ] [ ] [ ] [ , , , ]
第一次選擇我們調(diào)用了 ancestor 軸,可以獲取所有祖先節(jié)點,其后需要跟兩個冒號,然后是節(jié)點的選擇器,這里我們直接使用了 *,表示匹配所有節(jié)點,因此返回結(jié)果是第一個 li 節(jié)點的所有祖先節(jié)點,包括 html,body,div,ul。
第二次選擇我們又加了限定條件,這次在冒號后面加了 div,這樣得到的結(jié)果就只有 div 這個祖先節(jié)點了。
第三次選擇我們調(diào)用了 attribute 軸,可以獲取所有屬性值,其后跟的選擇器還是 *,這代表獲取節(jié)點的所有屬性,返回值就是 li 節(jié)點的所有屬性值。
第四次選擇我們調(diào)用了 child 軸,可以獲取所有直接子節(jié)點,在這里我們又加了限定條件選取 href 屬性為 link1.html 的 a 節(jié)點。
第五次選擇我們調(diào)用了 descendant 軸,可以獲取所有子孫節(jié)點,這里我們又加了限定條件獲取 span 節(jié)點,所以返回的就是只包含 span 節(jié)點而沒有 a 節(jié)點。
第六次選擇我們調(diào)用了 following 軸,可以獲取當(dāng)前節(jié)點之后的所有節(jié)點,這里我們雖然使用的是 * 匹配,但又加了索引選擇,所以只獲取了第二個后續(xù)節(jié)點。
第七次選擇我們調(diào)用了 following-sibling 軸,可以獲取當(dāng)前節(jié)點之后的所有同級節(jié)點,這里我們使用的是 * 匹配,所以獲取了所有后續(xù)同級節(jié)點。
以上是XPath軸的簡單用法,更多的軸的使用可以參考:http://www.w3school.com.cn/xp...。
14. 結(jié)語到現(xiàn)在為止我們基本上把可能用到的 XPath 選擇器介紹完了, XPath 功能非常強(qiáng)大,內(nèi)置函數(shù)非常多,熟練使用之后可以大大提升 HTML 信息的提取效率。
如想查詢更多 XPath 的用法可以查看:http://www.w3school.com.cn/xp...。
如想查詢更多 Python LXML 庫的用法可以查看:http://lxml.de/。
上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---27、Requests與正則表達(dá)式抓取貓眼電影排行
下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---29、解析庫的使用:BeautifulSoup
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44086.html
摘要:運行結(jié)果如果運行結(jié)果一致則證明安裝成功。上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)請求庫安裝下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)數(shù)據(jù)庫的安裝 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---2、請求庫安裝:GeckoDriver、PhantomJS、Aiohttp下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---數(shù)據(jù)庫的安裝:MySQL、MongoDB、Redis 抓取下網(wǎng)頁代碼之后,下一步就是從網(wǎng)頁中提取信息,提取信息的方式有...
摘要:所以我們?nèi)绻氆@取電影,只需要分開請求次,而次的參數(shù)設(shè)置為,,,,即可,這樣我們獲取不同的頁面結(jié)果之后再用正則表達(dá)式提取出相關(guān)信息就可以得到的所有電影信息了。上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)正則表達(dá)式下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)解析庫的使用 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---26、正則表達(dá)式下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---28、解析庫的使用:XPath 本節(jié)我們利用 Reque...
摘要:解析器在解析的時候?qū)嶋H上是依賴于解析器的,它除了支持標(biāo)準(zhǔn)庫中的解析器,還支持一些第三方的解析器比如,下面我們對支持的解析器及它們的一些優(yōu)缺點做一個簡單的對比。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---28、解析庫的使用:XPath下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---30、解析庫的使用:PyQuery 前面我們介紹了正則表達(dá)式的相關(guān)用法,但是一旦正則寫的有問題,可能得到的就...
摘要:上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)爬蟲框架的安裝下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)部署相關(guān)庫的安裝的安裝是一個中支持渲染的工具,本節(jié)來介紹一下它的安裝方式。另外一個是的庫的安裝,安裝之后即可在中使用服務(wù)。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---10、爬蟲框架的安裝:PySpider、Scrapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---12、部署相關(guān)庫的安裝:Docker、Scrapyd Scrap...
摘要:在前面我們講到了和的概念,我們向網(wǎng)站的服務(wù)器發(fā)送一個,返回的的便是網(wǎng)頁源代碼。渲染頁面有時候我們在用或抓取網(wǎng)頁時,得到的源代碼實際和瀏覽器中看到的是不一樣的。所以使用基本請求庫得到的結(jié)果源代碼可能跟瀏覽器中的頁面源代碼不太一樣。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---16、Web網(wǎng)頁基礎(chǔ)下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---18、Session和Cookies 爬蟲,即網(wǎng)...
閱讀 3670·2021-09-07 09:59
閱讀 725·2019-08-29 15:12
閱讀 810·2019-08-29 11:14
閱讀 1315·2019-08-26 13:27
閱讀 2669·2019-08-26 10:38
閱讀 3140·2019-08-23 18:07
閱讀 1281·2019-08-23 14:40
閱讀 1930·2019-08-23 12:38