日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

modelandview 可以返回html么_Python: 爬虫网页解析工具lxml.html(一)

發布時間:2024/9/3 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 modelandview 可以返回html么_Python: 爬虫网页解析工具lxml.html(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

狹義上講,爬蟲只負責抓取,也就是下載網頁。而實際上,爬蟲還要負責從下載的網頁中提取我們想要的數據,即對非結構化的數據(網頁)進行解析提取出結構化的數據(有用數據)。

所以說,網頁下載下來只是第一步,還有重要的一步就是數據提取。不同的爬蟲想要的數據不一樣,提取的數據也就不一樣,但提取方法都是類似的。

最簡單的提取數據的方法,就是使用正則表達式,此種方法簡單,提取的邏輯也不能復雜,不然寫出的正則表達式就晦澀難懂,甚至不能提取復雜的數據結構。

最終,老猿經過多年的使用經驗,選擇了lxml和xpath來解析網頁提取結構化數據。順便說一下 BeautifulSoup,它也是一個很棒的解析HTML的工具,可以使用多個解析器,比如Python標準庫的parser,但是速度比較慢,也可以使用lxml作為解析器,但是它的使用方法、API跟lxml不太一樣。使用下來,還是lxml的API更舒服。

lxml 對C語言庫 libxml2和 libxslt進行綁定,提供了Pythonic的API,它有一些主要特點:

  • 支持標準的XML
  • 支持(損壞)的HTML
  • 非常快的解析速度
  • Pythonic的API更易于使用
  • 使用Python的unicode字符串
  • 內存安全(沒有段錯誤)
  • 不需要手動管理內存

總結為一句話就是,C語言的速度和Python的簡易相結合的神器。

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

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

lxml.etree可以用來解析RSS feed,它就是一個XML格式的文檔。然而爬蟲抓取的絕大部分都是html網頁,所以,我們這里主要講述lxml.html解析網頁的方法。

lxml.html 從html字符串生成文檔樹結構

我們下載得到的網頁就是一串html字符串,如何把它輸入給lxml.html模塊,從而生成html文檔的樹結構呢?

該模塊提供了幾種不同的方法:

  • parse(filename_url_or_file):
  • 輸入的是一個文件名、URL或文件對象(有read()方法)。
  • document_fromstring(string):
  • 輸入的是一個html的字符串,創建一個HTML文檔樹結構,它的根節點就是, 和 子節點。
  • fragment_fromstring(string, create_parent=False):
  • 返回輸入字符串的HTML片段。這個片段壁紙只含有一個element(元素),也就是單一節點,除非給出了create_parent 參數,否則會報錯。
  • fragments_fromstring(string):
  • 返回包含輸入字符串中所有片段的列表。
  • fromstring(string):
  • 返回值依據輸入字符串而定,如果輸入看起來像是一個文檔,則返回document_fromstring(string),如果是一個單一片段,則返回fragment_fromstring(string)。

下面我們通過具體示例來說明上面幾個方法的不同。

document_fromstring 的使用方法

In [1]: import lxml.html as lhIn [2]: z = lh.document_fromstring('abcxyz')# 可以看到,它自動加了根節點In [3]: zOut[3]: In [4]: z.tagOut[4]: 'html'# 還加了節點In [5]: z.getchildren()Out[5]: []# 把字符串的兩個節點放在了里面In [6]: z.getchildren()[0].getchildren()Out[6]: [, ]

fragment_fromstring 的使用

In [11]: z = lh.fragment_fromstring(‘abcxyz’)---------------------------------------------------------------------------ParserError Traceback (most recent call last) in ()----> 1 z = lh.fragment_fromstring(‘abcxyz’)~/.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)# 可以看到,輸入是兩個節點(element)時就會報錯# 如果加上 create_parent 參數,就沒問題了In [12]: z = lh.fragment_fromstring('abcxyz', create_parent='p')In [13]: z.tagOut[13]: 'p'In [14]: z.getchildren()Out[14]: [, ]

fragments_fromstring 的使用

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

fromstring 的使用

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

這里,fromstring輸入的如果是多個節點,它會給加一個父節點并返回。但是像html網頁都是從節點開始的,我們使用fromstring() 和 document_fromstring() 都可以得到完整的網頁結構。

從上面代碼中我們可以看到,那幾個函數返回的都是HtmlElement對象,也就是說,我們已經學會了如何從html字符串得到HtmlElement的對象,下一節我們將學習如何操作HtmlElement對象,從中提取我們感興趣的數據。

總結

以上是生活随笔為你收集整理的modelandview 可以返回html么_Python: 爬虫网页解析工具lxml.html(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。