我是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>
-
<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"
的部分,它带有div和span-字段,并且一些相关信息隐藏在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'? - ?',
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语言。在
我们非常感谢您的帮助。在
您得到这个错误是因为其中一个标记没有任何}列表在搜索该索引时会给出一个错误。在
children
,所以{您可以通过以下方式进行审批:
1)搜索
data-label
标记2)找到下一个
TD
兄弟姐妹3 A)检查兄弟姐妹是否有文字
3 A)1)如果是,则创建一个dict条目,其中
data-label
为键,同级文本为其值3 A)B)如果没有,则检查同级第一个子级是否包含-value`
4)解析数据。在
示例:
结果:
相关问题 更多 >
编程相关推荐