如何用漂亮的汤从html表中提取数据

时间:2019-04-02 03:20:17

标签: python beautifulsoup

如何从下表中提取特定数据,例如衰减时间91.1 ms 5?

<table bgcolor=navy cellpadding=4 cellspacing=1 border=0 align=center> 
  <tr class=hp >
    <td nowrap>E(level) (MeV)</td>
    <td nowrap>J&pi;</td><td nowrap>&Delta;(MeV)</td>
    <td nowrap>T<sub>1/2</sub></td>
    <td nowrap>Decay Modes</td>
  </tr>
  <tr class=cp>
    <td nowrap valign=top>0.0</td>
    <td nowrap valign=top>4+</td>
    <td nowrap valign=top> 18.2010</td>
    <td nowrap valign=top>91.1 ms <i>5</i>&nbsp;</td>
    <td nowrap valign=top> &epsilon; : 100.00 &#37;<br>  &epsilon;p : 55.00 &#37;<br>  &epsilon;2p : 1.10 &#37;<br>  &epsilon;&alpha; : 0.04 &#37;<br> </td>
  </tr>
</table>

4 个答案:

答案 0 :(得分:0)

您可以使用get_element_by_tag_name获取表,并遍历每个内部标签并获取必要的数据。

答案 1 :(得分:0)

假设您已经在字符串中添加了标记。您必须按类(.cp)查找元素,然后必须按标记(td)查找元素,并且可以使用.text属性获取每个找到的元素的值,因此请使用以下代码:

import re
from bs4 import BeautifulSoup

html_doc = """<table bgcolor=navy cellpadding=4 cellspacing=1 border=0 align=center> 
  <tr class=hp >
    <td nowrap>E(level) (MeV)</td>
    <td nowrap>J&pi;</td><td nowrap>&Delta;(MeV)</td>
    <td nowrap>T<sub>1/2</sub></td>
    <td nowrap>Decay Modes</td>
  </tr>
  <tr class=cp>
    <td nowrap valign=top>0.0</td>
    <td nowrap valign=top>4+</td>
    <td nowrap valign=top> 18.2010</td>
    <td nowrap valign=top>91.1 ms <i>5</i>&nbsp;</td>
    <td nowrap valign=top> &epsilon; : 100.00 &#37;<br>  &epsilon;p : 55.00 &#37;<br>  &epsilon;2p : 1.10 &#37;<br>  &epsilon;&alpha; : 0.04 &#37;<br> </td>
  </tr>
</table>"""

soup = BeautifulSoup(html_doc, 'html.parser')
elements = soup.find_all(class_=re.compile("cp"))

for e in elements[0].find_all('td'):
    # the e.text contains the value of each td elements in your table
    print(e.text)

答案 2 :(得分:0)

下面是一个简单的代码,可以将该表放入pandas数据框中:

from bs4 import BeautifulSoup
import pandas as pd

page = """<table cellpadding=4 cellspacing=1 border=0 align=center> 
  <tr class=hp >
    <td nowrap>E(level) (MeV)</td>
    <td nowrap>J&pi;</td>
    <td nowrap>&Delta;(MeV)</td>
    <td nowrap>T<sub>1/2</sub></td>
    <td nowrap>Decay Modes</td>
  </tr>
  <tr class=cp>
    <td nowrap valign=top>0.0</td>
    <td nowrap valign=top>4+</td>
    <td nowrap valign=top> 18.2010</td>
    <td nowrap valign=top>91.1 ms <i>5</i>&nbsp;</td>
    <td nowrap valign=top> &epsilon; : 100.00 &#37;<br>  &epsilon;p : 55.00 &#37;<br>  &epsilon;2p : 1.10 &#37;<br>  &epsilon;&alpha; : 0.04 &#37;<br> </td>
  </tr>
</table>"""

soup = BeautifulSoup(page, "html.parser")
headers = soup.find('tr', {'class':'hp'}).findAll('td')
columns = []
for header in headers:
    columns.append(header.text)

data = []
data_raw = soup.findAll('tr',{'class':'cp'})
for row in data_raw:
    items = []
    for element in row.findAll('td'):
        items.append(element.text)
    data.append(items)

df = pd.DataFrame(data, columns=columns)

print(df['T1/2'])

输出为:

0    91.1 ms 5 
Name: T1/2, dtype: object

如果衰减模式中的内容为多行,则可能必须添加其他代码来检测(由<br>分隔),或者如果可以,请更正HTML在不同的行标签中包含不同的行,而在标题标签中包含标题

答案 3 :(得分:0)

通常,如果我看到<table>标记,则尝试使用熊猫.read_html()。它将重新调谐数据帧列表。然后,只需选择一个数据框并对其进行操作即可以所需的方式获取数据,或提取所需的数据即可。

import pandas as pd


html = '''<table bgcolor=navy cellpadding=4 cellspacing=1 border=0 align=center> 
  <tr class=hp >
    <td nowrap>E(level) (MeV)</td>
    <td nowrap>J&pi;</td><td nowrap>&Delta;(MeV)</td>
    <td nowrap>T<sub>1/2</sub></td>
    <td nowrap>Decay Modes</td>
  </tr>
  <tr class=cp>
    <td nowrap valign=top>0.0</td>
    <td nowrap valign=top>4+</td>
    <td nowrap valign=top> 18.2010</td>
    <td nowrap valign=top>91.1 ms <i>5</i>&nbsp;</td>
    <td nowrap valign=top> &epsilon; : 100.00 &#37;<br>  &epsilon;p : 55.00 &#37;<br>  &epsilon;2p : 1.10 &#37;<br>  &epsilon;&alpha; : 0.04 &#37;<br> </td>
  </tr>
</table>'''

tables = pd.read_html(html)
df = tables[0]
df.columns = df.iloc[0,:]
df = df.iloc[1:,:]

输出:

print(df.loc[1,'T1/2'])
91.1 ms 5