【问题标题】:Fix for missing 'tr' class in webscraping修复网络抓取中缺少“tr”类的问题
【发布时间】:2022-01-24 19:38:10
【问题描述】:

我正在尝试按行抓取不同的股票,数据来自https://www.slickcharts.com/sp500。我正在学习使用类似网站的教程,但是该网站的每一行都使用类,而我的没有(附在下面)。

这是我正在尝试使用的代码,但是我没有得到任何输出。我在编码方面还很陌生,所以欢迎任何反馈。

import requests
import pandas as pd
from bs4 import BeautifulSoup

company = []
symbol = []

url = 'https://www.slickcharts.com/sp500' #Data from SlickCharts
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
rows = soup.find_all('tr')

for i in rows:
    row = i.find_all('td')
    print(row[0])

【问题讨论】:

    标签: python html web-scraping


    【解决方案1】:

    首先,您需要在请求中添加一些标头,因为您很可能得到与我相同的:状态码403 Forbidden。这是因为该网站阻止了您的请求。添加User-Agent 就可以了:

    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'
    }
    
    page = requests.get(url, headers=headers)
    

    然后你可以像你一样迭代tr标签。但是你应该小心,因为例如第一个tr 没有td 标签,你会在行中得到异常:

    print(row[0])
    

    这是打印所有公司名称的代码示例:

    import requests
    from bs4 import BeautifulSoup
    
    company = []
    symbol = []
    
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    
    url = 'https://www.slickcharts.com/sp500' #Data from SlickCharts
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.text, 'html.parser')
    
    rows = soup.find_all('tr')
    for row in rows:
        all_td_tags = row.find_all('td')
        if len(all_td_tags) > 0:
            print(all_td_tags[1].text)
    
    

    但此代码还输出公司名称以外的一些其他数据。这是因为您正在遍历页面上的所有 tr 标记。但是您只需要遍历一个特定的表(在这种情况下是页面上的第一个表)。

    import requests
    from bs4 import BeautifulSoup
    
    company = []
    symbol = []
    
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
    
    url = 'https://www.slickcharts.com/sp500' #Data from SlickCharts
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.text, 'html.parser')
    
    first_table_on_the_page = soup.find('table')
    rows = first_table_on_the_page.find_all('tr')
    for row in rows:
        all_td_tags = row.find_all('td')
        if len(all_td_tags) > 0:
            print(all_td_tags[1].text)
    
    

    【讨论】:

    • 好的,现在我看到了其他表格...为此,我需要创建一个新变量“表格”并指定我要使用的表格吗?
    • 如果我正确理解你的意思,是的。更新了我的答案以进行澄清。
    • 最后我已经制定了自己的解决方案来处理这个问题,但再次感谢您的反馈!我个人包括table1 = soup.find('table', attrs={'class':'table table-hover table-borderless table-sm'}) 并在for 循环中使用它。谢谢!
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多