首页 > 解决方案 > 如何使用 Beautiful Soup 仅刮取连续的第一项

问题描述

我目前正在运行以下 python 脚本:

import requests
from bs4 import BeautifulSoup

origin= ["USD","GBP","EUR"]
i=0
while i < len(origin):
page = requests.get("https://www.x-rates.com/table/?from="+origin[i]+"&amount=1")
soup = BeautifulSoup(page.content, "html.parser")

tables = soup.findChildren('table')
my_table = tables[0]

rows = my_table.findChildren(['td'])

i = i +1


for rows in rows:
    cells = rows.findChildren('a')
    for cell in cells:
        value = cell.string
        print(value)

要从此 HTML 中抓取数据:

https://i.stack.imgur.com/DkX83.png

我遇到的问题是我正在努力只刮第一列而不刮第二列,因为它们都在标签下并且彼此位于同一表格行中。href 是唯一可以区分两个标签的东西,我尝试使用它进行过滤,但它似乎不起作用并返回一个空白值。此外,当我尝试手动对数据进行排序时,输出被垂直而不是水平修改,我是编码新手,所以任何帮助将不胜感激:)

标签: pythonweb-scrapingbeautifulsoup

解决方案


当您打印从顶部获得的每个项目时,例如在本例中从表格项目中打印时,更容易理解发生的情况。这个想法是一个接一个,这样你就可以跟随。

import requests
from bs4 import BeautifulSoup

origin= ["USD","GBP","EUR"]
i=0
while i < len(origin):
    page = requests.get("https://www.x-rates.com/table/?from="+origin[i]+"&amount=1")
    soup = BeautifulSoup(page.content, "html.parser")
    tables = soup.findChildren('table')
    my_table = tables[0]

    i = i +1

    rows = my_table.findChildren('tr')
    for row in rows:
        cells = row.findAll('td',class_='rtRates')
        if len(cells) > 0:
            first_item = cells[0].find('a')
            value = first_item.string
            print(value)

推荐阅读