2010-12-11 73 views
5

我是新來的Python和美麗的湯也!我聽說過BS。它被告知是解析和提取內容的好工具。所以在這裏我是...:美麗的湯[Python]和表中的文字提取

我想採取HTML 文件中表的第一個td的內容。例如,我有這張桌子

<table class="bp_ergebnis_tab_info"> 
    <tr> 
      <td> 
        This is a sample text 
      </td> 

      <td> 
        This is the second sample text 
      </td> 
    </tr> 
</table> 

我怎樣才能使用beautifulsoup採取文本「這是一個示例文本」? 我使用soup.findAll('table',attrs = {'class':'bp_ergebnis_tab_info'})獲取整個表的 。

謝謝...或者我應該嘗試使用Perl獲得整個東西...我不太熟悉。另一個解決方案將是PHP中的正則表達式。

參閱目標[1]:http://www.schulministerium.nrw.de/BP/SchuleSuchen?action=799.601437941842&SchulAdresseMapDO=142323

注;因爲html有點無效 - 我認爲我們必須做一些清理工作。這可能會導致很多PHP代碼 - 因爲我們想在PHP中解決這個問題。 Perl也是一個很好的解決方案。

一些提示和想法的出發點非常感謝 零

+1

很明顯,你沒有從你的Perl問題中得到太多東西,所以我甚至不知道爲什麼這個問題是用Perl標記的。此外,請勿每幾周創建一個新帳戶:創建一個並堅持使用它。 @zero知道我在說什麼。其他人可以看看http:// stackoverflow。com/users/477580/thebutcher和http://stackoverflow.com/q/3991571/100754以及從那裏鏈接的問題。 – 2010-12-11 13:44:20

回答

12

首先找到表(因爲你是這樣做)。在列表中使用find而非findall返回的第一個項目(而不是返回所有被發現的清單 - 在這種情況下,我們不得不增加額外的[0]採取列表的第一個元素):

table = soup.find('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 

然後使用find再次找到第一td

first_td = table.find('td') 

然後使用renderContents()提取文本內容:

text = first_td.renderContents() 

...和作業完成(儘管你可能還需要使用strip()除去開頭和結尾的空格:

trimmed_text = text.strip() 

這應該給:

>>> print trimmed_text 
This is a sample text 
>>> 

達到目標。

+0

你好psmears,很多很多謝謝你的答案。你鼓勵我使用美麗的湯!你的提示非常非常流利和簡潔。非常感謝「Learing-a-new-technique」這一偉大資產。我很開心。 Greetings Zero – zero 2010-12-11 09:53:15

+0

你可以使用'find()'搜索文本內容而不是'text ='嗎? – User 2015-10-30 04:25:11

-1

我發現美麗的湯非常有效的工具,所以要學習它:-)它能夠解析頁面無效的標記,因此應該能夠處理您所介紹的頁面。如果您想要使用有效標記獲取有效的重新格式化頁面源,則可能需要使用命令BeautifulSoup(html).prettify()命令。

至於你的問題,你的第一個soup.findAll(...)命令的結果也是一個美麗的湯對象,你可以進行第二次搜索中,就像這樣:

table_soup = soup.findAll('table' ,attrs={'class':'bp_ergebnis_tab_info'}) 
your_sample_text = table_soup.find("td").renderContents().strip() 

print your_sample_text 
+0

馬丁你好 - 非常感謝你的提示。我對你的發帖感到非常高興:你鼓勵我學習美麗的湯!我會做!至於代碼。我會將該代碼應用於上述目標網址。我回來報告我的所有發現。再次 - 非常感謝您的幫助!這對我來說是一個很好的學習資產!對你(以及整個社區)的問候 – zero 2010-12-11 09:37:53