如何仅使用Beautiful Soup刮擦连续的第一项

时间:2018-06-26 13:47:35

标签: python web-scraping beautifulsoup

我当前正在运行以下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是唯一可以区分这两个标签的东西,我尝试使用此标签进行过滤,但它似乎无法正常工作并返回空白值。另外,当我尝试手动对数据进行排序时,输出在垂直方向而不是水平方向进行了修改,因此我是编码的新手,所以可以提供任何帮助:)

2 个答案:

答案 0 :(得分:0)

当您打印从顶部得到的每个项目时,例如,当打印从顶部得到的每个项目时,将更容易理解发生的情况。在这种情况下,来自表格项。这个想法是一个一个地走,以便您可以跟随。

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)

答案 1 :(得分:0)

您可能还想尝试另一种方法来实现相同目的:

import requests
from bs4 import BeautifulSoup

keywords = ["USD","GBP","EUR"]

for keyword in keywords:
    page = requests.get("https://www.x-rates.com/table/?from={}&amount=1".format(keyword))
    soup = BeautifulSoup(page.content, "html.parser")
    for items in soup.select_one(".ratesTable tbody").find_all("tr"):
        data = [item.text for item in items.find_all("td")[1:2]]
        print(data)