美丽汤 - 在<td>过滤掉的同时查找<a>可能?



我在抓取某个网站时遇到了一些麻烦,因为大多数信息都被奇怪地埋葬了,而且表的大小也不一致。

下面是一个HTML的例子:

<tbody>
<tr>
<td>
<a href="LINK">Player1</a>
</td>
<td>Position1</td>
<td>
<b>Player1 Injury</b>
<br>
"Date of injury1"
</td>
<td>
<a href="LINK" class="BUTTON"></a>
</td>
</tr>
<tr class="COLLAPSE"></tr>
<tr>
<td>
<a href="LINK">Player2</a>
</td>
<td>Position2</td>
<td>
<b>Player2 Injury</b>
<br>
"Date of injury2"
</td>
<td>
<a href="LINK" class="BUTTON"></a>
</td>
</tr>
<tr class="COLLAPSE"></tr>
</tbody>

给定这些数据,我所要做的就是拉出球员受伤和受伤日期的<td>

如果我输入

injury.find_all('td')

当然,我将得到所有我不需要的额外数据。我想要拉的所有数据将始终在第3个<td>标签中,但我也需要在新标签中再次找到第3个<td>标签。过滤掉class="COLLAPSE"应该很容易实现,希望不会使这成为一个问题。

那么,抓取这个数据的结果,我想要的结果是:

['Player1 Injury', 'Date of injury1', 'Player2 Injury', 'Date of injury2']

非常感谢所有的帮助。

感谢您的html。以此为例,我认为我们需要迭代<tbody>标签中的每个<tr>标签,检查它是否有">

如果<tr>标签没有"类,然后您可以找到其中的所有<td>标签并提取第三个(索引2),其中包含球员的受伤和受伤日期。

下面的代码:

from bs4 import BeautifulSoup
# HTML code
html = """
<tbody>
<tr>
<td>
<a href="LINK">Player1</a>
</td>
<td>Position1</td>
<td>
<b>Player1 Injury</b>
<br>
"Date of injury1"
</td>
<td>
<a href="LINK" class="BUTTON"></a>
</td>
</tr>
<tr class="COLLAPSE"></tr>
<tr>
<td>
<a href="LINK">Player2</a>
</td>
<td>Position2</td>
<td>
<b>Player2 Injury</b>
<br>
"Date of injury2"
</td>
<td>
<a href="LINK" class="BUTTON"></a>
</td>
</tr>
<tr class="COLLAPSE"></tr>
</tbody>
"""
# Parse the HTML
soup = BeautifulSoup(html, 'html.parser')
# Find all <tr> tags within the <tbody> tag
trs = soup.tbody.find_all('tr')
# Extract the player's injury and the date of their injury from each <tr> tag
injuries = []
for tr in trs:
if not tr.has_attr('class') or 'COLLAPSE' not in tr['class']:
tds = tr.find_all('td')
injury = tds[2].b.get_text().strip()
date = tds[2].find_all('br')[-1].next_sibling.strip()
injuries.append(injury)
injuries.append(date)
print(injuries) 
# Output: ['Player1 Injury', 'Date of injury1', 'Player2 Injury', 'Date of injury2']

所有内容都在trtbody中的第三个td中。然后我们可以获得第一个<b>标记和最后一个子标记(这是一个文本节点)。然后使用.strip()去掉空格和换行符,第二条带去掉"(如果你没有看到这些引号,你可以删除这个.strip)。

data = [
item
for injury in soup.select("tbody > tr > td:nth-of-type(3)")
for item in [injury.find("b").text, list(injury)[-1].text.strip().strip('"')]
]

输出
['Player1 Injury', 'Date of injury1', 'Player2 Injury', 'Date of injury2']

相关内容

  • 没有找到相关文章

最新更新