2015-04-01 84 views
1

我是第一次使用python(和編程)並使用BeautifulSoup將html錶轉換爲字典而不會丟失結構

我試圖找到解析HTML中的表格內容並將其轉換爲字典的最佳方式 - 理想情況下以最脆弱的方式。

這裏是我試圖解析的HTML的一個例子(我已經把文本的鍵值數字放到了我想要提取的地方)。

<div class="tablename"> 
<table border="0" cellpadding="0" cellspacing="0" style="border: 1px solid #dddddd; border-collapse: collapse; font-family: Arial, Helvetica, sans-serif; font-size: 14px; margin: 0; padding: 0; width: 100%"> 
<thead> 
<tr> 
<th colspan="4" style="background-color: #000; border: 1px solid #616161; color: #ffffff; font-size: 14px; font-weight: bold; line-height: 20px; padding: 14px 20px 12px 20px; text-align: left">Some text not needed</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
<td style="width: 20px"> </td> 
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; width: 42.5%; vertical-align: middle">Key 1</td> 
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 1</td> 
<td style="width: 20px"> </td> 
</tr> 
<tr> 
<td> </td> 
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; vertical-align: middle">Key 2</td> 
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 2</td> 
<td> </td> 
</tr> 
<tr> 
<td> </td> 
<td style="border-bottom: 1px solid #dddddd; color: #666666; font-size: 14px; line-height: 20px; padding: 11px 20px 10px 0; text-align: left; vertical-align: middle">Key 3</td> 
<td style="border-bottom: 1px solid #dddddd; color: #000; font-size: 14px; line-height: 20px; padding: 11px 0 10px 0; text-align: left; vertical-align: middle">Value 3</td> 
<td> </td> 
</tr> 
<tr> 

和代碼我使用:

import requests 
from bs4 import BeautifulSoup 

html = requests.get('https://examplewebaddress.com') 
soup = BeautifulSoup(html.text) 
print(soup.tbody.text) 

然後我可以遍歷所有的soup.tbody.text字符串分割到這個鍵值對。但這似乎不是一個好方法,我似乎通過將表格轉換爲字符串而丟失了表格的結構,然後再將其重新構建到字典中。

有沒有更直接的方法來解析表BeautifulSoup(或更適合的東西)到一個字典,然後我可以使用?

回答

2

的想法是迭代表的行和爲每一行中提取第二文本和第三細胞,將表示鍵和未來字典的值:

soup = BeautifulSoup(html.text) 

result = dict([[item.get_text(strip=True) for item in row.find_all('td')[1:3]] 
       for row in soup.select("div.tablename table tr")[1:]]) 

print result 

對於提供樣本數據,它打印:

{u'Key 1': u'Value 1', u'Key 2': u'Value 2', u'Key 3': u'Value 3'} 

div.tablename table trCSS selector,將匹配下具有元件所有tr元件以class="tablename"作爲父母。我們正在切分select[1:])的結果以跳過第一個標題行。

+0

感謝實際數據在表格第12行內有一個小標題,然後是另外3行相關的數據。 – Yunti 2015-04-01 18:23:03

+1

@Yunti這是一個完美的時機:) :) – alecxe 2015-04-01 18:25:17

+0

抱歉沒有及時完成編輯:感謝實際數據在表格第12行內有一個小標題,然後是另外3行相關的數據。丟棄第12行副標題的最好方法是什麼?只要用切片[1:12]和[13:16]做兩次'結果'? – Yunti 2015-04-01 18:37:42

相關問題