當前位置:首頁 » 編程語言 » htmlparserpython

htmlparserpython

發布時間: 2022-04-16 12:08:37

python爬蟲時出現 import name HTMLParseError'是什麼意思

進到Python安裝目錄\Python\Python35-32\Lib\site-packages\bs4\builder目錄下,找到_htmlparser.py,用idle打開,注釋掉HTMLParseError這行就行了

❷ python 怎麼提取html內容啊(正則)

python提取html內容的方法。如下參考:

1.首先,打開Python來定義字元串,在定義的字元串後面加上中括弧,然後在要提取的字元位置輸入。

❸ Python問題 我想用它自帶的HTMLParser庫 解析html頁面某個標簽的數據 求大神告知

如果你想提取指定tag之間的內容,建議使用bs4或者lxml去實現。

frombs4importBeautifulSoup

s="""<a>abcdefg</a><div>20</div>"""

soup=BeautifulSoup(s)
tag=soup.find("div")
printtag.string

如果解決了您的問題請採納!
如果未解決請繼續追問!

❹ python html 解析工具是什麼意思

在准備我的 PyCon上關於HTML的演講 的時候我覺得我應該對現有的一些解析器和文檔模型做個性能對比。

實際上,情況有點復雜,因為處理HTML需要幾個步驟:

解析這個 HTML
把它解析為一個對象(比如一個文檔對象)
把它序列化
有些解析器只處理第一步,有些只處理第二步,有些能處理所有的三個步驟…。例如,ElementSoup 使用 ElementTree 來表示文檔,卻使用 BeautifulSoup 作為實際的解析器。而 BeautifulSoup 內部也擁有一個文檔對象。 HTMLParser 僅僅做解析(不解析出任何對象),然而 html5lib 卻能夠生成幾種不同的文檔樹(DOM樹)。序列化也分為XML和HTML兩種方式。

所以我選取了下面這些解析器的庫做基準性能測試:

lxml:包含一個解析器,能夠產生文檔對象,支持HTML序列化。它也可以不適用內置的解析器而使用 BeautifulSoup 或者 html5lib 進行解析。
BeautifulSoup:nbsp;包含一個解析器,能夠產生文檔對象,支持HTML序列化。
html5lib:有解析器。它也有一個序列化器,但是我沒有使用它。它也有一個內置的文檔對象(即simpletree),只是…除了自我測試我也不知道這東西還能做什麼。
ElementTree:這個包里有一個XML序列化器,ElementTree能夠產生文檔對象,它也是python內置的XML解析模塊。(我覺得下個版本會帶一個HTML序列化器,不過我也沒測試這個XML序列化器)。它也有一個解析器,測試的時候我用html5lib當做解析器來測試ElementTree的。
cElementTree:這是一個使用C語言擴展實現的python模塊,實現了ElementTree。
HTMLParser:包含一個解析器。但是其實它不能解析出文檔對象,很多正常網頁都不能正常處理(包含Table或者Script),有語法錯誤的網頁就更處理不了了。它只是使用解析器遍歷文檔。
htmlfill:它使用了HTMLParser作為解析器,相對HTMLParser,它在解析過程中對Element做了更多處理。
Genshi[1]:包含一個解析器,能夠產生文檔對象,支持HTML序列化。
xml.dom.minidom:python標准庫里的內置文檔模型,html5lib 能夠解析出這種文檔對象。(我並不推薦使用minidom — 這篇文章里寫了一些理由,還有很多理由我沒寫出來)
我預想 lxml 的性能會比較好,因為它基於 libxml2這個C庫。但是實際上它的性能比我預計的還要好,超過其它所有的同類庫。所以,除非考慮到一些難以解決的安裝問題(尤其是在Mac上),我都推薦你用lxml 來進行HTML解析的工作。

我的測試代碼在這里,你可以自己下載下來運行測試程序。裡麵包含了所有的樣例數據,用來生成圖表的命令在這里。這些測試數據來自於從 python.org 隨機選取的一些頁面(總共355個)。

解析

lxml:0.6; BeautifulSoup:10.6; html5lib ElementTree:30.2; html5lib minidom:35.2; Genshi:7.3; HTMLParser:2.9; htmlfill:4.5

第一個測試運行這些解析器解析文檔。需要注意的是:lxml 比 HTMLParser快6倍,盡管 HTMLParser
不生成任何文檔對象(lxml在內存中建立了一個文檔樹)。這里也沒有包含 html5lib 所能生成的全部種類的樹,因為每一種花費的時間都差不多。之所以包含了使用 xml.dom.minidom 作為輸出結果的 html5lib 測試結果是為了說明 minidom 有多慢。Genshi確實很快,只是它也是最不穩定的,相比之下,html5lib , lxml 以及 BeautifulSoup 都要健壯的多。html5lib 的好處是,總是能夠正確的解析HTML(至少在理論上如此)。

lxml在解析過程中會釋放 GIL ,但是我覺得應該影響不大。

序列化

lxml:0.3; BeautifulSoup:2.0; html5lib ElementTree:1.9; html5lib minidom:3.8; Genshi:4.4

所有這些庫執行序列化都很快,可是 lxml 又一次遙遙領先。ElementTree 和 minidom 只做XML序列化,但是沒有理由說HTML序列化更快。還有就是,Genshi居然比minidom要慢,實話說任何比minidom要慢的東西都挺讓人震驚的。

內存佔用

lxml:26; BeautifulSoup:82; BeautifulSoup lxml:104; html5lib cElementTree:54; html5lib ElementTree:64; html5lib simpletree:98; html5lib minidom:192; Genshi:64; htmlfill:5.5; HTMLParser:4.4

最後一項測試是內存。我並不是特別確信我做這個測試的方法很科學,但是數據總能說明一些問題。這項測試會解析所有的文檔並把解析出來的DOM樹保存在內存中,利用 ps 命令結果的RSS(resident set size)段來表示進程佔用的內存。計算基準內存佔用之後所有的庫已經被import,所以只有解析HTML和生成文檔對象會導致內存使用量上升。

我才用 HTMLParser 作為基準線,因為它把文檔保存在內存中,只產生一些中間字元串。這些中間字元串最終也不回佔用多少內存,因為內存佔用基本上等同於這些html問價大小之和。

測量過程中有個棘手的問題就是python的內存分配器並不會釋放它請求的內存,所以,如果一個解析器創建了很多中間對象(字元串等等)然後又釋放了它們,進程仍然會持有這些內存。為了檢測是否有這種情況,我試著分配一些新的字元串知道進程佔用的內存增長(檢測已經分配但是沒有被使用的內存),但是實際上沒檢測到什麼,只有 BeautifulSoup 解析器,在序列化到一個 lxml 樹的時候,顯示出使用了額外的內存。

只有在內存測試中,html5lib 使用 cElementTree 來表示文檔對象同使用 ElementTree 能表現出明顯的不同。我倒不是很驚訝,我猜因為我沒有找到一個C語言編寫的序列化工具,我猜使用 cElementTree 構建文檔樹的話,只有在用本地代碼調用它的時候比較快(就像本地的libxml,並且不需要把數據結構傳遞到python中)。

lxml比較節省內存很可能是因為它使用了本地的libxml2的數據結構,並且只有在需要的時候才創建Python對象。

總結

在進行基準測試之前我就知道lxml會比較快,但是我自己也沒料到會這么快。

所以呢,總結一下:lxml太牛逼了[2]。你可以用很多種方式使用它,你可以對一個HTML進行解析,序列化,解析,再序列化,在機器卡機之前你能重復這些操作很多次。很多操作都是通過本地介面實現的,python只做了一層很淺的封裝。例如,如果你做一次XPath查詢,查詢字元串會被編譯為本地代碼,然後遍歷本地的libxml2對象,只在返回查詢結果的時候才會產生一個python對象。 另外,測試中lxml內存佔用比較小使我更有理由相信lxml在高負載的情況下仍然會很可靠。

我覺得,文檔樹相對按字元流解析(不生成樹,只掃描一次文檔並針對特定的標簽做處理)更有優勢。表面看起來按字元流解析更好:你不把整個文檔放在內存里,處理的時間之和文檔大小線性相關。HTMLParser就是這樣一種解析器,遇到各種符號(標簽開始和關閉,變遷中間的文字等等)。Genshi 也是用的這個模型,因為使用了一些更高級的特性(比如 filters
)所以使用起來更自然一些。其實字元流模型本身就不是一種特別自然的處理XML文檔的方式,從某種程度上說,它只是用來處理一些本來就可以當做字元串處理的文檔的一種笨拙的方法(regex可以實現同樣的功能)。只有你需要處理上G的XML文件的時候按字元流解析才有意義(不過lxml和ElementTree針對這種情況都有額外的參數支持)。HTML文件不會有這么大,這些測試也有理由讓我們相信lxml可以很好的處理大的HTML文件,所以一個大文檔也不會導致一個為小文檔優化過的系統崩潰。

Ian Bicking on Sunday, March30th, 2008

[1]. Genshi是EdgewallSoftware的產品,它的其他產品還包括大名鼎鼎的Trac。

[2]. 本文的作者Ian Bicking是lxml.html(lxml的一個模塊)的開發者和維護者(這里修正一下)。

P.S. 譯者記:這里還有一個解析器沒有提到就是python標准庫里的SGMLParser,它也可以產生ElementTree,但是性能很差,本機測試解析600k的html文檔(ddd的單頁html文檔)需要480秒,不推薦應用在性能要求比較高的場合。本文作者也是lxml的作者,對自己的作品大力推薦也是正常的,我實測過lxml性能確實很好。

❺ python 解析html 什麼包好

對html的解析是網頁抓取的基礎,分析抓取的結果找到自己想要的內容或標簽以達到抓取的目的。
HTMLParser是python用來解析html的模塊。它可以分析出html裡面的標簽、數據等等,是一種處理html的簡便途徑。 HTMLParser採用的是一種事件驅動的模式,當HTMLParser找到一個特定的標記時,它會去調用一個用戶定義的函數,以此來通知程序處理。它主要的用戶回調函數的命名都是以handler_開頭的,都是HTMLParser的成員函數。當我們使用時,就從HTMLParser派生出新的類,然後重新定義這幾個以handler_開頭的函數即可。這幾個函數包括:
handle_startendtag 處理開始標簽和結束標簽
handle_starttag 處理開始標簽,比如<xx> tag不區分大小寫

handle_endtag 處理結束標簽,比如</xx>
handle_charref 處理特殊字元串,就是以&#開頭的,一般是內碼表示的字元
handle_entityref 處理一些特殊字元,以&開頭的,比如
handle_data 處理數據,就是<xx>data</xx>中間的那些數據
handle_comment 處理注釋
handle_decl 處理<!開頭的,比如<!DOCTYPE html PUBLIC 「-//W3C//DTD HTML 4.01 Transitional//EN」
handle_pi 處理形如<?instruction>的東西
def handle_starttag(self,tag,attr):
#注意:tag不區分大小寫,此時也可以解析 <A 標簽
# SGMLParser 會在創建attrs 時將屬性名轉化為小寫。

if tag=='a':
for href,link in attr:
if href.lower()=="href":
pass

1. 基本解析,找到開始和結束標簽

[python] view plain
<span style="font-size:18px;">#coding:utf-8

from HTMLParser import HTMLParser
'''''
HTMLParser的成員函數:

handle_startendtag 處理開始標簽和結束標簽
handle_starttag 處理開始標簽,比如<xx>
handle_endtag 處理結束標簽,比如</xx>
handle_charref 處理特殊字元串,就是以&#開頭的,一般是內碼表示的字元
handle_entityref 處理一些特殊字元,以&開頭的,比如
handle_data 處理數據,就是<xx>data</xx>中間的那些數據
handle_comment 處理注釋
handle_decl 處理<!開頭的,比如<!DOCTYPE html PUBLIC 「-//W3C//DTD HTML 4.01 Transitional//EN」
handle_pi 處理形如<?instruction>的東西

'''
class myHtmlParser(HTMLParser):
#處理<!開頭的內容
def handle_decl(self,decl):
print 'Encounter some declaration:'+ decl
def handle_starttag(self,tag,attrs):
print 'Encounter the beginning of a %s tag' % tag
def handle_endtag(self,tag):
print 'Encounter the end of a %s tag' % tag
#處理注釋
def handle_comment(self,comment):
print 'Encounter some comments:' + comment

if __name__=='__main__':
a = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\
<html><head><!--insert javaScript here!--><title>test</title><body><a href="http: //www.163.com">鏈接到163</a></body></html>'
m=myHtmlParser()
m.feed(a)
m.close()

輸出結果:

Encounter some declaration:DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"
Encounter the beginning of a html tag
Encounter the beginning of a head tag
Encounter some comments:insert javaScript here!
Encounter the beginning of a title tag
Encounter the end of a title tag
Encounter the beginning of a body tag
Encounter the beginning of a a tag
Encounter the end of a a tag
Encounter the end of a body tag
Encounter the end of a html tag</span>

❻ python怎麼導入htmlparser

我在python2.7里試了一下,可以直接:
import HTMLParser
是可以執行的。
題主遇到了什麼問題嗎?

❼ python htmlparser 怎麼獲取嵌套的節點

通過htmlparser獲取嵌套的節點

def handle_starttag(self, tag, attrs):
#print "Encountered the beginning of a %s tag" % tag
if tag == "a":
if len(attrs) == 0: pass
else:
for (variable, value) in attrs:
if variable == "href":
self.links.append(value)
用self.get_starttag_text()取出來<a href="www.google.com.hk">,取出test這個值

❽ python 中的htmlparser怎麼抓取報告html中的內容

比如抓取連接
import HTMLParser, urllib

class linkParser(HTMLParser.HTMLParser):
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.links = []
def handle_starttag(self, tag, attrs):
if tag=='a':
self.links.append(dict(attrs)['href'])

htmlSource = urllib.urlopen("http://xxx").read(200000)
p = linkParser()
p.feed(htmlSource)
for link in p.links:
print link

❾ Python自帶的HTMLParser解析HTML時, 怎麼把取出Form下所有是hidden的input

HTMLParser好像不是個很好的解決方案吧,他本來就有很多缺陷,而且他也是基於正則匹配的。

你還不如自己寫個正則匹配去匹配所有input,type是hidden的。

要麼就用Beautiful Soup,這個也不用安裝,直接用就可以了。

熱點內容
資料庫pf 發布:2024-04-20 05:57:36 瀏覽:392
c語言編譯出現連接錯誤 發布:2024-04-20 05:42:18 瀏覽:197
湖北戴爾伺服器維修系統雲主機 發布:2024-04-20 05:36:47 瀏覽:61
android上傳數據 發布:2024-04-20 05:36:43 瀏覽:142
python替換文本內容 發布:2024-04-20 05:21:22 瀏覽:898
urllib3源碼 發布:2024-04-20 05:11:23 瀏覽:34
如何通過運行打開伺服器文件 發布:2024-04-20 00:06:50 瀏覽:670
電腦百度網盤怎麼上傳 發布:2024-04-19 23:49:15 瀏覽:416
陸放四驅買哪個配置 發布:2024-04-19 23:49:08 瀏覽:407
岳陽點外賣什麼軟體安卓 發布:2024-04-19 23:46:27 瀏覽:44