如何从不同的表条目中提取信息:Text vs.DIV vs.SPAN

2024-09-29 23:15:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,在网上搜索我的问题的答案,但是到目前为止我失败了。。。在

问题:我的目标是从网站中提取数据。更具体地说,从这些网站的表格。在我的python代码示例中的“data”中找到的网站代码的相关片段如下:

from bs4 import BeautifulSoup

data = '''<table class="ds-table">
        <tr>
          <td class="data-label">year of birth:</td>
                        <td class="data-value">1994</td>
       </tr>
        <tr>
            <td class="data-label">reporting period:</td>
          <td class="data-value">
            <span class="editable" id="c-scope_beginning_date">
              ?                </span>
            &nbsp;-&nbsp;
            <span  class="editable" id="c-scope_ending_date">
              ?                </span>
          </td>
         </tr>
        <tr>
            <td class="data-label">reporting cycle:</td>
          <td class="data-value">
            <span class="editable" id="c-periodicity">
              -                </span>
          </td>
        </tr>
        <tr>
              <td class="data-label">grade:</td>
              <td class="data-value">1.3, upper 10% of class</td>
            </tr>
            <tr>
              <td class="data-label">status:</td>
              <td class="data-value"></td>
              </tr>
      </table>
        <table class="ds-table">
             <tr>
              <td class="data-label">economics:</td>
                <td class="data-value"><span class="positive-value"></span></td>
            </tr>
             <tr>
              <td class="data-label">statistics:</td>
              <td class="data-value"><span class="negative-value"></span></td>
            </tr>
            <tr>
          <td class="data-label">social:</td>
          <td class="data-value"><div id="music_id" class="trigger"><span class="negative-value"></span></div></td>
        </tr>
        <tr>
          <td class="data-label">misc:</td>
           <td class="data-value">
            <div id="c_assurance" class="">
                <span class="positive-value"></span>                </div>
           </td>
        </tr>
        <tr>
            <td class="data-label">recommendation:</td>
            <td class="data-value">
                <span class="negative-value"></span>                </td>
        </tr>  
                  </table>'''

soup = BeautifulSoup(data)

对于class=“data label”到目前为止,我成功地实现了。。。在

^{pr2}$

…它从列中提取文本,在(我满意的)输出中:

[u'year of birth:',
 u'reporting period:',
 u'reporting cycle:',
 u'grade:',
 u'status:',
 u'economics:',
 u'statistics:',
 u'social:',
 u'misc:',
 u'recommendation:']

我被卡住的地方是class="data-value"的部分,它带有divspan-字段,并且一些相关信息隐藏在span类中。此外,不同网站的tr-行的数量可以改变,例如,“status”在“reporting cycle”(而不是“grade”)之后。在

但是,当我这么做的时候。。。在

box_cdv = []
for j, cdv in enumerate(soup.findAll('td', attrs={'class': 'data-value'})):
   box_cdv.append(cdv.contents[0])
print box_cdv

…我得到一个错误:

Traceback (most recent call last):

  File "<ipython-input-53-7d5c095cf647>", line 3, in <module>
    box_cdv.append(cdv.contents[0])

IndexError: list index out of range

我想要的是这样的(对应于上面的“数据”—示例):

[u'1994',
 u'? &nbsp;-&nbsp; ?',
 u'-',
 u'1.3, upper 10% of class',
 u'',
 u'positive-value',
 u'negative-value',
 u'negative-value',
 u'positive-value',
 u'negative-value']

问题:鉴于适当的提取代码取决于类别的类型(出生年份、报告期,…,建议),如何提取这些信息并从每个tr行收集相关数据?在

或者,以不同的方式询问:根据类别(出生年份、报告期,…,推荐),什么代码提取我,相应的值(1994,…,负值)?在

由于表条目的数量和类型可能因网站而异,因此简单的“在第i个条目上执行以下操作”程序不适用。我想我要找的是类似“如果你找到了文本“推荐:”然后从span字段中提取类类型”,我想。但不幸的是,我不知道如何将其翻译成python语言。在

我们非常感谢您的帮助。在


Tags: ofdividdatavalue网站tablelabel
1条回答
网友
1楼 · 发布于 2024-09-29 23:15:36

您得到这个错误是因为其中一个标记没有任何children,所以{}列表在搜索该索引时会给出一个错误。在

您可以通过以下方式进行审批:

1)搜索data-label标记

2)找到下一个TD兄弟姐妹

3 A)检查兄弟姐妹是否有文字

3 A)1)如果是,则创建一个dict条目,其中data-label为键,同级文本为其值

3 A)B)如果没有,则检查同级第一个子级是否包含-value`

4)解析数据。在

示例:

soup = BeautifulSoup(data, 'lxml')

result = {}

for tag in soup.find_all("td", { "class" : "data-label" }):
    NextSibling = tag.find_next("td", { "class" : "data-value" }).get_text(strip = True)
    if not NextSibling and len(tag.find_next("td").select('span[class*=-value]')) > 0:
        NextSibling = tag.find_next("td").select('span[class*=-value]')[0]["class"][0]
    result[tag.get_text(strip = True)] = NextSibling

print (result)

结果:

{ 'year of birth:': '1994', 'reporting period:': '?-?', 'reporting cycle:': '-', 'grade:': '1.3, upper 10% of class', 'status:': '', 'economics:': 'positive-value', 'statistics:': 'negative-value', 'social:': 'negative-value', 'misc:': 'positive-value', 'recommendation:': 'negative-value' }

相关问题 更多 >

    热门问题