我在抓取某个网站时遇到了一些麻烦,因为大多数信息都被奇怪地埋葬了,而且表的大小也不一致。
下面是一个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']
所有内容都在tr
和tbody
中的第三个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']