天天看點

Xpath初級的一個例子

爬蟲裡面最難的問題就是捕獲資料,而捕獲資料現在市面上至少有四種方法:

1)利用urllib.request.urlopen(url)獲得的源代碼是str模式,使用.find找到頭和尾的光标位,然後利用[光标位1:光标位2]來擷取内容;

2)正規表達式,即(.*?),雖然正則在寫上面最無腦,但是錯誤率最高,捕獲網頁用處實在不大,捕獲一些文本檔案的時候還可以一用。而且(.*?)能搜尋開頭值不能搜尋末尾值,如下圖。

<a href="http://s4.51cto.com/wyfs02/M01/79/27/wKiom1aKHqDA24uHAADIbfHvH54265.png" target="_blank"></a>

3)Beautiful Soup,這個相對要好一點,先from bs4 import BeautifulSoup啟動子產品,然後 soup=beautiful.soup(url,"html.parser",from-encoding="utf-8")解析網頁源代碼,然後soup.find_all(對應的節點标簽),輸出即可。

4)Xpath,這玩意目前好像隻能支援2.7,沒有支援3.5版本的。而且mysql要連結python的話,官方插件隻能認可2.7,是以說裡外裡都要回歸2.7。

Xpath的操作步驟,先from lxml from etree啟動子產品,然後selector=etree.HTML(url)來将html轉成etree識别的東西,再設定一個變量=selextor.xpath(節點路徑),然後輸出

做一個Xpath的例子。

html='''

  &lt;html&gt;

    &lt;head lang="en"&gt;

      &lt;meta charset="utf-8"&gt;

      &lt;title&gt;TEST&lt;/title&gt;

    &lt;/head&gt;

  &lt;body&gt;

    &lt;div id="content"&gt;

      &lt;ul id="useful"&gt;

        &lt;li&gt;THIS IS FIRST MESSAGE!&lt;/li&gt;

        &lt;li&gt;THIS IS SECOND MESSAGE!&lt;/li&gt;

        &lt;li&gt;THIS IS THIRD MESSAGE!&lt;/li&gt;

      &lt;/ul&gt;

      &lt;ul id="useless"&gt;

        &lt;li&gt;ONE no&lt;/li&gt;

        &lt;li&gt;TWO no&lt;/li&gt;

        &lt;li&gt;THREE no&lt;/li&gt;

      &lt;div id="url"&gt;

        &lt;a href="http://www.baidu.com" title="nishiruozhi"&gt;BAIDU&lt;/a&gt;

        &lt;a href="http://www.sina.com.cn" title="woshitiancai"&gt;SINA&lt;/a&gt;

      &lt;/div&gt;

    &lt;/div&gt;

  &lt;/body&gt;

  &lt;/html&gt;'''

from lxml import etree

selector=etree.HTML(html)

content=selector.xpath('//body/div/ul[@id="useful"]/li/text()')

print content[0]

這個的輸出結果就是:THIS IS FIRST MESSAGE

若改成

for each in content:

  print(each)

這個的輸出結果就是:

THIS IS FIRST MESSAGE!

THIS IS SECOND MESSAGE!

THIS IS THIRD MESSAGE!

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1731398