使用python和漂亮的汤从html表中提取数据

时间:2018-05-15 21:20:25

标签: python html beautifulsoup

<table class="softwares" border="1" cellpadding="0" width="99%">
    <thead style="background-color: #ededed">
        <tr>
            <td colspan="5"><b>Windows</b></td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><b>Type</b></td>
            <td><b>Issue</b></td>
            <td><b>Restart</b></td>
            <td><b>Severity</b></td>  
            <td><b>Impact</b></td>  
        </tr>
        <tr>
            <td>some item</td>
            <td><a href="some website">some website</a><br></td>
            <td>Yes<br></td>
            <td>Critical<br></td>
            <td>stuff<br></td>
        </tr>    
        <tr>
            <td>some item</td>
            <td><a href="some website">some website</a><br></td>
            <td>Yes<br></td>
            <td>Important<br></td>
            <td>stuff<br></td>    
        </tr>
    </tbody>
</table>

我试图从中获取数据的html页面是我保存到我的电脑上的本地文件,并且填充了多个格式与此相同的表格。我试图获得这两个表的标题,在这个特定情况下&#34; Windows,&#34;以及位于桌子主体中的网址。我一直在尝试使用漂亮的汤和蟒蛇来获取表格标题和网站,并将它们打印在左边标题的表格中,以及右边的相应网址,但我无法这样做。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以使用find_all收集所有td标记对象,然后应用其他逻辑来存储href s:

from bs4 import BeautifulSoup as soup
import re
s = soup(re.sub('\s', '', open('filename.html').read()), 'lxml')
final_results = [[i.text, i.find('a')['href']] if i.find('a') else i.text for i in s.find_all('td')]
name = final_results[0]
header = final_results[1:6]
full_results = final_results[6:]

输出:

u'Windows'
[u'Type', u'Issue', u'Restart', u'Severity', u'Impact']
[u'some item', [u'some website', 'some website'], u'Yes', u'Critical', u'stuff', u'some item', [u'some website', 'some website'], u'Yes', u'Important', u'stuff']

结果可以进一步组合成字典:

table = [dict(zip(header, full_results[i:i+5])) for i in range(0, len(full_results), 5)]

输出:

[{u'Impact': u'stuff', u'Issue': [u'some website', 'some website'], u'Type': u'some item', u'Severity': u'Critical', u'Restart': u'Yes'}, {u'Impact': u'stuff', u'Issue': [u'some website', 'some website'], u'Type': u'some item', u'Severity': u'Important', u'Restart': u'Yes'}]

答案 1 :(得分:0)

我不确定这是不是你想做的事情:

soup = BeautifulSoup(content,'lxml') # content variable holds the `table elements`
title = soup.select_one(".softwares thead td b").text
links = [item.a.get("href") for item in soup.select(".softwares tr td") if item.a]
print(title,links)

输出:

Windows ['some website', 'some website']