使用BeautifulSoup

时间:2016-09-20 00:54:36

标签: python-2.7 beautifulsoup

我有一个如下所示的表结构:

<tr><td>
<td>
<td bgcolor="#E6E6E6" valign="top" align="left">testtestestes</td>
</tr>
<tr nowrap="nowrap" valign="top" align="left">
<td nowrap="nowrap">8-K</td>
<td class="small">Current report, items 1.01, 3.02, and 9.01
<br>Accession Number: 0001283140-16-000129 &nbsp;Act: 34 &nbsp;Size:&nbsp;520 KB
</td>
<td nowrap="nowrap">2016-09-19<br>17:30:01</td>
 <td nowrap="nowrap">2016-09-19</td><td align="left" nowrap="nowrap"><a href="/cgi-bin/browse-edgar?action=getcompany&amp;filenum=001-03473&amp;owner=include&amp;count=100">001-03473</a>
<br/>161891888</td></tr>

这是一行数据。这是我使用beautifulSoup的脚本。我可以得到<tr><td>就好了。但它们在一个单独的列表中。

for tr in (soup.find_all('tr')):
        tds = tr.find_all('td')
        print tds

我的问题是如何从两个单独的<tr>获取数据并使其看起来像是一行数据。我想在<td>

之间获取文字

1 个答案:

答案 0 :(得分:0)

如果你想配对它们,请从soup.find_all('tr')创建一个迭代器,然后将压缩成对:

it = iter(soup.find_all('tr'))
for tr1, tr2  in zip(it, it):
        tds = tr1.find_all('td') + tr2.find_all("td")
        print(tds)

切片的等价物是从不同的起始位置开始并使用2的步骤:

it = soup.find_all('tr')
for tr1, tr2  in zip(it[::2], it[1::2]):
        tds = tr1.find_all('td') + tr2.find_all("td")
        print(tds)

使用 iter 意味着您无需浅层复制列表。

不确定如何将不均匀的trs量放入逻辑中,因为没有任何东西可以配对,但如果有,你可以使用izip_longest

from itertools import izip_longest # python3 zip_longest

it = iter(soup.find_all('tr'))
for tr1, tr2  in izip_longest(it, it):
        tds = tr1.find_all('td') + tr2.find_all("td") if tr2 else []
        print(tds)