2015-01-15 154 views
0

我是非常新的網絡抓取任何形狀或形式,我一直在嘗試進入Python,我聽說網絡抓取是暴露自己到Python的好方法。所以,經過多次谷歌搜索後,我終於使用了兩個高度推薦的模塊:Requests和BeautifulSoup。我已經閱讀了相當數量的文章,並對如何使用它們有了基本的瞭解。Python Web刮索引

我發現了一個很基本的網站(基本在沒有太多的內容或JavaScript之類,使解析HTML容易得多),我有以下代碼:

import requests 
from bs4 import BeautifulSoup 

soup = BeautifulSoup(requests.get('http://www.basicwebs.co.uk/contact.htm').text) 

for row in soup('div',{'id': 'Layer1'})[0].h2('font'): 
    tds = row.text 
    print tds 

此代碼作品。這將產生以下結果:

BASIC 
    WEBS 
Contact details 
Contact details 

其中,如果您花幾分鐘這個網頁上檢查代碼,是正確的結果(我認爲)。現在,就是這段代碼工作的時候,如果我想要獲得頁面的不同部分呢?正如頁面上的小段所述:「如果您有興趣設計和託管我們的網站,請通過電子郵件或電話與我們聯繫。」 - 我的理解是簡單地將索引號更改爲相應的文本標題,但是當我更改它時,會收到一條消息,指出索引超出範圍。

任何人都可以幫忙嗎? (越簡單,你可以把它,如果可能的話)

我使用Python 2.7.8

回答

1

文本則需要由字體標籤具有屬性的大小= 3包圍,所以一個辦法做到這一點通過選擇這樣它的第一次出現:

font_elements = soup('font', {'size': 3}) 

if font_elements: 
    print font_elements[0].text 

結果:

如果你有興趣有一個網站設計 和由我們主辦考慮,請通過電子郵件Ø與我們聯繫電話。

+1

非常感謝您的回答!產生正是我正在尋找的 – WhoDidYouSay

1

您可以直接做到這一點:

soup('font',{'size': '3'})[0].text 

不過,我想提醒你注意向你以前犯的錯誤。

soup('div',{'id': 'Layer1'}) 

這會返回id ='Layer1'的div標籤,它可以是多個標籤。因此,它基本上返回其div標籤具有id ='Layer1'的所有HTML元素的列表,但不幸的是,您嘗試解析的HTML有一個這樣的元素。所以它出界了。

您可能可以使用一些像bpython或ipython這樣的python交互式解釋器來測試你在一個對象中得到了什麼。快樂的黑客!

+0

感謝您的建議! – WhoDidYouSay