爬蟲入門到精通-網頁的解析(xpath)
本文章屬於爬蟲入門到精通系統教程第六講
在爬蟲入門到精通第五講中,我們了解了如何用正則表達式去抓取我們想要的內容.這一章我們來學習如何更加簡單的來獲取我們想要的內容.
xpath的解釋
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。
XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力。起初XPath的提出的初衷是將其作為一個通用的、介於XPointer與XSL間的語法模型。但是XPath很快的被開發者採用來當作小型查詢語言。
XPath的基本使用
要使用xpath我們需要下載lxml,在爬蟲入門到精通-環境的搭建這一章也說明怎麼裝,如果還沒有安裝的話,那就去下載安裝吧
直接看代碼實戰吧。
from lxml import etreenn# 定義一個函數,給他一個html,返回xml結構ndef getxpath(html):n return etree.HTML(html)nn# 下面是我們實戰的第一個htmlnsample1 = """<html>n <head>n <title>My page</title>n </head>n <body>n <h2>Welcome to my <a href="#" src="x">page</a></h2>n <p>This is the first paragraph.</p>n <!-- this is the end -->n </body>n</html>n"""n# 獲取xml結構ns1 = getxpath(sample1)nn# 獲取標題(兩種方法都可以)n#有同學在評論區指出我這邊相對路徑和絕對路徑有問題,我搜索了下n#發現定義如下圖ns1.xpath(//title/text())ns1.xpath(/html/head/title/text())n
相對路徑與絕對路徑
總結及注意事項
- 獲取文本內容用 text()
- 獲取注釋用 comment()
- 獲取其它任何屬性用@xx,如
- @href
- @src
- @value
sample2 = """n<html>n <body>n <ul>n <li>Quote 1</li>n <li>Quote 2 with <a href="...">link</a></li>n <li>Quote 3 with <a href="...">another link</a></li>n <li><h2>Quote 4 title</h2> ...</li>n </ul>n </body>n</html>n"""ns2 = getxpath(sample2)n
總結及注意事項
- 上面的li 可以更換為任何標籤,如 p、div
- 位置默認以1開始的
- 最後一個用 li[last()] 不能用 li[-1]
- 這個一般在抓取網頁的下一頁,最後一頁會用到
sample3 = """<html>n <body>n <ul>n <li id="begin"><a href="https://scrapy.org">Scrapy</a>begin</li>n <li><a href="https://scrapinghub.com">Scrapinghub</a></li>n <li><a href="https://blog.scrapinghub.com">Scrapinghub Blog</a></li>n <li id="end"><a href="http://quotes.toscrape.com">Quotes To Scrape</a>end</li>n <li data-xxxx="end" abc="abc"><a href="http://quotes.toscrape.com">Quotes To Scrape</a>end</li>n </ul>n </body>n</html>n"""ns3 = getxpath(sample3)n
總結及注意事項
- 根據html的屬性或者文本直接定位到當前標籤
- 文本是 text()=xxx
- 其它屬性是@xx=xxx
- 這個是我們用到最多的,如抓取知乎的xsrf(見下圖)
- 我們只要用如下代碼就可以了//input[@name="_xsrf"]/@value
sample4 = u"""n<html>n <head>n <title>My page</title>n </head>n <body>n <h2>Welcome to my <a href="#" src="x">page</a></h2>n <p>This is the first paragraph.</p>n <p class="test">n 編程語言<a href="#">python</a>n <img src="#" alt="test"/>javascriptn <a href="#"><strong>C#</strong>JAVA</a>n </p>n <p class="content-a">a</p>n <p class="content-b">b</p>n <p class="content-c">c</p>n <p class="content-d">d</p>n <p class="econtent-e">e</p>n <p class="heh">f</p>n <!-- this is the end -->n </body>n</html>n"""ns4 = etree.HTML(sample4)n
總結及注意事項
- 想要獲取某個標籤下所有的文本(包括子標籤下的文本),使用string
- 如 <p>123<a>來獲取我啊</a></p>,這邊如果想要得到的文本為"123來獲取我啊",則需要使用string
- starts-with 匹配字元串前面相等
- contains 匹配任何位置相等
- 當然其中的(@class,"content")也可以根據需要改成(text(),"content")或者其它屬性(@src,"content")
最後再次總結一下
看完本篇文章後,你應該要
- 能學會基本所有的xpath的使用
- css和這個的原理一樣,所以就不介紹了,可以參考
- CSS 選擇器參考手冊
- 所有代碼在kimg1234/pachong
歡迎關注本人的微信公眾號獲取更多Python爬蟲相關的內容
(可以直接搜索「Python爬蟲分享」)
推薦閱讀:
※*吧上有海外留學生問全部用遞歸求第N個質數,不能用循環
※python Web 運維 爬蟲.....一條龍學習視頻教程
※《Django By Example》第一章 中文翻譯
※10min手寫(b六):b面試題解析丨Python實現多連接下載器