如何用不同的列标记(1 = td和2 = a在td内)刮除tr?

时间:2019-08-03 12:24:59

标签: python beautifulsoup

我在刮桌子时遇到了问题。该表由以下几行组成,请参考下面的html代码:

<tr>
    <td align="center" class="hell" width="20%"> <b>1 : 0</b> </td>
    <td class="hell"> <a href="/speler_profiel/tjeerd-westdijk/" title="Tjeerd Westdijk">Tjeerd Westdijk</a> 1.</td>
</tr>, 
<tr>
    <td align="center" class="dunkel" width="20%"><b>2 : 0</b></td>
    <td class="dunkel"><a href="/speler_profiel/emiel-wendt/" title="Emiel Wendt">Emiel Wendt</a> 20.</td>
</tr>

请注意,每一行都包含两列。在第一列(td)中,我只想刮擦标签so->'1:0'和'2:0'中的文本。在第二列中,我只想将a标记内的文本刮下来->'Tjeerd Westdijk'和'Emiel Wendt'。

运行代码时(请参阅下文),我将文本从a标记之外获取(也位于第二列),即1.&20。

这是我的代码:

scores = []

for row in td1_7[start:end]:
scores.append([data.get_text(strip=True) for data in row.find_all('td')])

final_df = pd.DataFrame(scores, columns=['Score','Playes'])

print(final_df)

这给了我以下输出:

比分 0 1:0 Tjeerd Westdijk1。 1 2:0 Emiel Wendt20。

如何删除列播放器中的1和20。?

1 个答案:

答案 0 :(得分:0)

在该列中选择--- BasedOnStyle: WebKit BreakBeforeBraces: Allman BraceWrapping: AfterEnum: false IndentCaseLabels: 'true' AlignConsecutiveAssignments: 'true' AlignConsecutiveDeclarations: 'true' AlignEscapedNewlines: 'true' AlignTrailingComments: 'true' AllowShortFunctionsOnASingleLine: 'false' #... 而不是整个<td>玩家名称,并获得<a>属性:

title

打印:

data = '''<tr>
    <td align="center" class="hell" width="20%"> <b>1 : 0</b> </td>
    <td class="hell"> <a href="/speler_profiel/tjeerd-westdijk/" title="Tjeerd Westdijk">Tjeerd Westdijk</a> 1.</td>
</tr>
<tr>
    <td align="center" class="dunkel" width="20%"><b>2 : 0</b></td>
    <td class="dunkel"><a href="/speler_profiel/emiel-wendt/" title="Emiel Wendt">Emiel Wendt</a> 20.</td>
</tr>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'html.parser')

rows = []
for col1, col2 in zip(soup.select('td:nth-of-type(1)'), soup.select('td:nth-of-type(2) a[title]')):
    rows.append((col1.get_text(strip=True), col2['title']))

print('{: <20}{: <20}'.format('Score', 'Players'))
print('-' * 40)
for row in rows:
    print(''.join('{: <20}'.format(d) for d in row))