簡體   English   中英

BeautifulSoup解析HTML表

[英]BeautifulSoup to parse an HTML table

這是我第一次使用BeautifulSoup,並且試圖解析HTML表。 到目前為止,通過其他示例,我已經能夠編寫一些簡單的代碼來非常接近我的需要。 但是,通過使用ele.text.strip() ,我最終丟失了部分我想保留的信息。

如下所示,這是我的代碼現在的樣子:

soup = BeautifulSoup(open("data_table.htm"))

table = soup.find("div", id="CT_Main_1_divResults")
table_body = table.find('tbody')
rows = table_body.find_all('tr')

data = []
for row in rows:
    cols = row.find_all('td')
    cols = [ele.text.strip() for ele in cols]
    data.append(cols)

結果:

[u'$4,090,000,000',
 u'13.61%',
 u'4,550,000',
 u'100 Grainger Pkwy.',
 u'',
 u'',
 u'']

我以為也許可以消除ele.text.strip()行,並使用相同的代碼,如下所示:

data = []
for row in rows:
    cols = row.find_all('td')
    data.append(cols)

以下是提供的結果:

[<td><span style="text-align: right; height: 36px;">$4,090,000,000</span></td>,
 <td><span style="text-align: right; height: 36px;">13.61%</span></td>,
 <td><span style="text-align: right; height: 36px;">4,550,000</span></td>,
 <td class=""><span style="text-align: right; height: 36px;">100 Grainger Pkwy.</span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/cancel.gif"/></span></td>,
 <td class="tdbrdrright"><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>]

解決此問題的一種方法可能是使用第二個選項並進行一些精美的字符串解析以獲取我需要的內容,但我希望有更好的方法。 最后,我希望數據如下所示。 我該如何調整代碼以實現這一目標?

[u'$4,090,000,000',
 u'13.61%',
 u'4,550,000',
 u'100 Grainger Pkwy.',
 u'Inside%20the%20Databases.com_files/True.gif',
 u'Inside%20the%20Databases.com_files/calcel.gif',
 u'Inside%20the%20Databases.com_files/True.gif']
import bs4

html = '''<td><span style="text-align: right; height: 36px;">$4,090,000,000</span></td>,
 <td><span style="text-align: right; height: 36px;">13.61%</span></td>,
 <td><span style="text-align: right; height: 36px;">4,550,000</span></td>,
 <td class=""><span style="text-align: right; height: 36px;">100 Grainger Pkwy.</span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>,
 <td><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/cancel.gif"/></span></td>,
 <td class="tdbrdrright"><span style="text-align: right; height: 36px;"><img src="Inside%20the%20Databases.com_files/True.gif"/></span></td>'''
soup = bs4.BeautifulSoup(html, 'lxml')

for td in soup('td'):
    if td.text:
        print(td.text)
    else:
        print(td.img.get('src'))

出:

$4,090,000,000
13.61%
4,550,000
100 Grainger Pkwy.
Inside%20the%20Databases.com_files/True.gif
Inside%20the%20Databases.com_files/cancel.gif
Inside%20the%20Databases.com_files/True.gif

print更改為append ,您將獲得此輸出的列表。

您想要的缺少信息在img標簽的屬性中,而不是文本中。

試試看。 如果存在多個img標簽或文本以及img標簽等,則需要根據要執行的操作進行調整,但這將使您正確地開始。

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("data-table.html"), 'html.parser')

table = soup.find("div", id="CT_Main_1_divResults")
table_body = table.find('tbody')
rows = table_body.find_all('tr')

data = []
for row in rows:
    cols = []
    for col in row.find_all('td'):
        t = col.text.strip()
        if not t:
            for img in row.find_all('img'):
                t = img.attrs['src']

        cols.append(t)
    data.append(cols)

print(data)

輸出:

[[u'$4,090,000,000', u'13.61%', u'4,550,000', u'100 Grainger Pkwy.', u'Inside%20the%20Databases.com_files/True.gif', u'Inside%20the%20Databases.com_files/True.gif', u'Inside%20the%20Databases.com_files/True.gif']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM