如何解析一个值,其中类名称的变化取决于值?



我有下一个html代码:

...   
<tr class="main">...</tr>
...
<tr class="main">

<td class="int">JJJ</td>
<td class="int">18</td>

<td class="int">
**<span class="plus">20%</span>
<span class="minus">-15%</span>**
</td>

<td class="int">02/06/2022</td>

</tr>
...
<tr class="main">...</tr>
...

我需要解决<span class="plus">20%</span><span class="minus">-15%</span>的情况。在html代码中,您可以看到这两行,但在实时中它是这样工作的:如果值为负,html只显示<span class="minus">-15%</span>行,如果值为正,它只显示<span class="plus">20%</span>

我写了解析代码,但是如何使用if else和检查span类名来解决这个问题,或者可能有其他方法来修复它:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
item = soup.find_all('tr', class_='main')
data = []
for i in item:
data.append({
'percent': i.find('td', class_='int').find_next('td', class_='int').find_next('td', class_='int').get_text()
print(data) 

在我看来,没有必要检查class,因为值的位置总是相同的-所以只需从<td>中提取值并将其存储在字典列表中:

data.append(dict(zip(['Name','Amount','Percentage','Date'],row.stripped_strings)))

但是要回答您的问题,只需使用逗号(,)将多个选择器连接到一个列表中。当出现一个选择器列表时,列表中任何匹配元素的选择器都将返回该元素——因为只有一个类,它将选择正确的那个:

data.append({'percentag':row.select_one('.plus,.minus').text})
from bs4 import BeautifulSoup
html='''
<tr class="main">
<td class="int">AAA</td>
<td class="int">18</td>
<td class="int">
<span class="minus">-15%</span>
</td>
<td class="int">02/06/2022</td>
</tr>
<tr class="main">
<td class="int">BBB</td>
<td class="int">18</td>
<td class="int">
<span class="plus">20%</span>
</td>
<td class="int">02/06/2022</td>
</tr>
'''
soup = BeautifulSoup(html)
data = []
for row in soup.select('tr'):
data.append(dict(zip(['Name','Amount','Percentage','Date'],row.stripped_strings)))
data
输出
[{'Name': 'AAA', 'Amount': '18', 'Percentage': '-15%', 'Date': '02/06/2022'}, {'Name': 'BBB', 'Amount': '18', 'Percentage': '20%', 'Date': '02/06/2022'}]

最新更新