我是一名编码初学者,在装有 Visual Code Studio 的 Windows 10 上使用 Python 3.7.1。
作为练习,我试图从网页中抓取一些按表格组织的数据。
现在,我只想提取一些嵌套在
<td valign="top" style="width:25%;">Parte edibile, %</td><td align="left" valign="top" style="font-weight:bold;">75</td>
值。作为分隔符,我有 <td> ... </td>
我确实尝试了很多方法只获取每一行的第一行和第二行,因为第三行对我来说不感兴趣,这只是浪费我不需要的内存。
为此,我使用了一个“for”循环,但正如我通过 BeautifulSoup 电子表格所了解的那样,当它需要一个循环时,每一行的所有嵌套参数都合并为一个,因此如果我想要 slice [0: 1] = >> 第一个和第二个“字符串”参数 <td> </td>
, 是不可能的。
这是简单的循环“for”:
for alim in soup.find_all('td')[0:1]: return alim.text
我说的对吗?任何人都可以向我提出一些更聪明的解决方案来解决我的问题?
提前感谢您的任何建议。 最大
最佳答案
如果我没理解错的话,你的表格有超过 3 列,而你只对前两列感兴趣。
要从前两列中提取数据,您有多种选择。一种是使用 CSS 选择器:
data = '''
<table>
<tr>
<td valign="top" style="width:25%;">I. Parte edibile, %</td>
<td align="left" valign="top" style="font-weight:bold;">I. 75</td>
<td>This doesn't interest me</td>
</tr>
<tr>
<td valign="top" style="width:25%;">II. Parte edibile, %</td>
<td align="left" valign="top" style="font-weight:bold;">II. 75</td>
<td>II. This doesn't interest me</td>
</tr>
<tr>
<td valign="top" style="width:25%;">III. Parte edibile, %</td>
<td align="left" valign="top" style="font-weight:bold;">III. 75</td>
<td>III. This doesn't interest me</td>
</tr>
</table>'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
for col1, col2 in zip(soup.select('td:nth-of-type(1)'), soup.select('td:nth-of-type(2)')):
print('{: <25} {}'.format(col1.text, col2.text))
打印:
I. Parte edibile, % I. 75
II. Parte edibile, % II. 75
III. Parte edibile, % III. 75
或者你可以使用列表切片:
rows = []
for tr in soup.select('tr'):
rows.append([td.text for td in tr.select('td')[0:2]])
for row in rows:
print('{: <25} {}'.format(*row))
编辑:要解析页面 http://www.bda-ieo.it/test/ComponentiAlimento.aspx?Lan=Ita&foodid=1300_2
,您可以使用以下代码:
from bs4 import BeautifulSoup
import requests
url = 'http://www.bda-ieo.it/test/ComponentiAlimento.aspx?Lan=Ita&foodid=1300_2'
soup = BeautifulSoup(requests.get(url).text, 'html.parser')
for col1, col2 in zip(soup.select('#tblComponenti > tr.testonormale > td:nth-of-type(1)'), soup.select('#tblComponenti > tr.testonormale > td:nth-of-type(2)')):
print('{: <70} {}'.format(col1.text, col2.text))
打印:
Parte edibile, % 75
Energia, ricalcolata, kJ 406
Energia, Ric con fibra, kJ 406
Energia, ricalcolata, kcal 96
Energia, Ric con fibra, kcal 96
Proteine totali, g 16,8
Proteine animali, g 16,8
Proteine vegetali, g 0,0
Lipidi totali, g 2,6
Lipidi animali, g 2,6
Lipidi vegetali, g 0,0
Colesterolo, mg 61
Carboidrati disponibili (MSE), g 1,5
Amido (MSE), g 0,0
Carboidrati solubili (MSE), g 1,5
Fibra alimentare totale, g 0,0
Alcol, g 0,0
Acqua, g 76,5
Ferro, mg 2,8
Calcio, mg 148
Sodio, mg 104
Potassio, mg 278
Fosforo, mg 196
Zinco, mg 4,20
Magnesio, mg 22
Rame, mg 1,00
Selenio, µg 37,0
Cloro, mg 130
Iodio, µg 29
Manganese, mg 0,07
Zolfo, mg 150
Vitamina B1, Tiamina, mg 0,06
Vitamina B2, Riboflavina, mg 0,26
Vitamina C, mg 0
Niacina, mg 14,00
Vitamina B6, mg 0,14
Folati totali, µg 9
Acido pantotenico, mg 0,65
Biotina, µg 6,0
Vitamina B12, µg 0,6
Retinolo equivalente 32
Retinolo eq. (RE), µg 32
Retinolo, µg tr
ß-carotene eq., µg 0,29
Vitamina E (ATE), mg 11,00
Vitamina D, µg 1,30
Acidi grassi saturi totali, g 0,00
Somma degli acidi butirrico, caproico, caprilico e caprico, g 0,00
Acido laurico, g 0,14
Acido miristico, g 1,01
Acido palmitico, g 0,13
Acido stearico, g tr
Acido arachidico, g 0,00
Acido beenico, g 0,40
Acidi grassi monoinsaturi totali, g 0,00
Acido miristoleico, g 0,10
Acido palmitoleico, g 0,17
Acido oleico, g 0,01
Acidi eicosenoico, g 0,01
Acido erucico, g 0,85
Acidi grassi polinsaturi totali, g 0,01
Acido linoleico, g 0,01
Acido linolenico, g tr
Acido arachidonico, g 0,27
Acido eicosapentaenoico (EPA), g 0,52
Acido decosaesaenoico (DHA), g 0,04
Altri acidi grassi polinsaturi, g 175
Triptofano, mg 726
Treonina, mg 823
Isoleucina, mg 1330
Leucina, mg 1379
Lisina, mg 349
Metionina, mg 183
Cistina, mg 595
Fenilalanina, mg 425
Tirosina, mg 759
Valina, mg 758
Arginina, mg 675
Istidina, mg 919
Alanina, mg 1764
Acido aspartico, mg 2261
Acido glutammico, mg 722
Glicina, mg 460
Prolina, mg 650
Serina, mg 1,5
Glucosio, g 0,0
Fruttosio, g 0,0
Galattosio, g 0,0
Saccarosio (MSE), g 0,0
Maltosio (MSE), g 0,0
关于python - <for> 循环的切片函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57508896/