2010-08-26 150 views
2

我是Python的新手,我一直在嘗試使用已使用BeautifulSoup解析的正則表達式搜索HTML。我沒有取得任何成功,我認爲原因是我沒有完全理解如何正確設置正則表達式。我已經看過有關類似問題的老問題,但我仍然沒有弄清楚。如果有人可以提取「/ torrent/32726/0 /」和「Slackware Linux 13.0 [x86 DVD ISO]」以及正則表達式如何工作的詳細表達式,那將非常有幫助。從Python解析HTML中提取文本

<td class="name"> 
    <a href="/torrent/32726/0/"> 
    Slackware Linux 13.0 [x86 DVD ISO] 
    </a> 
</td> 

編輯:我的意思說的是,我試圖提取 「/洪流/ 32726/0 /」 和 「Slackware的Linux的13.0 x86的DVD ISO]」 使用BeautifulSoups功能搜索解析樹。在搜索和閱讀文檔後,我一直在嘗試各種各樣的東西,但我仍然不確定如何去做。

+0

現在,他們使用的解析器,仍然希望使用正則表達式oO你想要什麼,用'/ torrent /'開始用href提取錨點的內容?你必須走分析樹。您可以使用正則表達式來確定當前節點是否是您想要的,但您必須走解析器構建的樹。 – delnan 2010-08-26 13:17:59

+0

我想我正在使用錯誤的術語。你是對的,我想採用BeautifulSoup生成的解析樹,並且我想提取「/ torrent/32726/0 /」和「Slackware Linux 13.0 [x86 DVD ISO]」,並將它們存儲在自己的字典中。 – FlowofSoul 2010-08-26 13:24:58

回答

3

BeautifulSoup也可以從你的html中提取節點值。

from BeautifulSoup import BeautifulSoup 

html = ('<html><head><title>Page title</title></head>' 
     '<body>' 
     '<table><tr>' 
     '<td class="name"><a href="/torrent/32726/0/">Slackware Linux 13.0 [x86 DVD ISO]</a></td>' 
     '<td class="name"><a href="/torrent/32727/0/">Slackware Linux 14.0 [x86 DVD ISO]</a></td>' 
     '<td class="name"><a href="/torrent/32728/0/">Slackware Linux 15.0 [x86 DVD ISO]</a></td>' 
     '</tr></table>' 
     'body' 
     '</html>') 
soup = BeautifulSoup(html) 
links = [td.find('a') for td in soup.findAll('td', { "class" : "name" })] 
for link in links: 
    print link.string 

輸出:

Slackware Linux 13.0 [x86 DVD ISO] 
Slackware Linux 14.0 [x86 DVD ISO] 
Slackware Linux 15.0 [x86 DVD ISO] 
+0

嘿,你從未使用過重新模塊¬¬ – razpeitia 2010-08-26 15:01:56

2

你可以使用lxml.html解析HTML文檔:

from lxml import html 

doc = html.parse('http://example.com') 

for a in doc.cssselect('td a'): 
    print a.get('href') 
    print a.text_content() 

你將不得不看文件是如何構成的,以找到最好的確定你想要的鏈接的方式(可能有其他鏈接的表格,你不需要等等):你可能首先需要例如找到正確的table元素。除了css選擇器(例如xpath)之外,還有其他選項可用於搜索文檔/元素。

如果你需要,你可以把鏈接成絕對鏈接與.make_links_absolute()方法(解析後做它的文檔,以及所有URL的將是絕對的,非常方便)