【问题标题】:Not able to parse table data beautifulsoup from website bseindia.com无法从网站 bseindia.com 解析表数据 beautifulsoup
【发布时间】:2018-12-09 00:46:06
【问题描述】:

我遇到无法从以下链接解析数据的情况,例如:

https://www.bseindia.com/stock-share-price/avanti-feeds-ltd/avanti/512573/

从这个网页我想填充高低表。我尝试了许多 table 和 div 的组合但徒劳无功。下面是我的python beautifulsoup 代码(BS4)

import csv
import requests
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup

f = open('bse.csv', 'w', newline = '')
writer = csv.writer(f)

with open("bselist.csv") as f:

    for row in csv.reader(f):

        for stock in row:

            url = "https://www.bseindia.com/stock-share-price/{}".format(stock)    
            soup = BeautifulSoup(urllib.request.urlopen(url).read(), "lxml")    
            mydivs = soup('div', {"class": "newscripcotent5"})[0].find_all('span')    
            writer.writerow([stock] + mydivs)
            print([stock] + mydivs)

URL 为简单起见,我提供了指向文件 bselist.csv 中包含的记录之一的直接链接。我正在寻找 div id "highlow"

它只是给我以下输出

avanti-feeds-ltd/avanti/512573/

没有我要找的桌子。

理想情况下,输出应该类似于以下内容:

avanti-feeds-ltd/avanti/512573/ 52 Week High (adjusted) 999.00(13/11/2017)
avanti-feeds-ltd/avanti/512573/ 52 Week Low (adjusted)  410.26(05/06/2018)
avanti-feeds-ltd/avanti/512573/ 52 Week High (Unadjusted)   3,000.00(13/11/2017)
avanti-feeds-ltd/avanti/512573/ 52 Week Low (Unadjusted)    535.50(29/06/2018)
avanti-feeds-ltd/avanti/512573/ Month H/L   659.34/410.26
avanti-feeds-ltd/avanti/512573/ Week H/L    625.25/508.82

【问题讨论】:

    标签: python csv beautifulsoup


    【解决方案1】:

    您尝试获取的信息似乎是使用 javascript 动态填充的,这可能就是您无法获取它的原因。因此,为了解决这个问题,您可以使用selenium webdriver 来获取动态内容。

    这就是代码的样子:

    import csv
    from bs4 import BeautifulSoup
    from selenium import webdriver
    
    output_file = open('bse.csv', 'w')
    
    with open("bselist.csv") as f:
        for row in csv.reader(f):
            for stock in row:
                url = "https://www.bseindia.com/stock-share-price/{}".format(stock)
                driver = webdriver.Chrome('/path/to/chromedriver')
                driver.get(url)
                html = driver.page_source
                soup = BeautifulSoup(html, "html.parser")
                div = soup.find_all('div', {"class": "newscripcotent5"})[0]
                outer_table = div.find_all('table')[0]
                inner_table = outer_table.findChildren("table")[0]
                rows = inner_table.findChildren("tr")
                for row in rows:
                    cols = row.findChildren("td")
                    if len(cols) < 2:
                        continue
                    output_file.write(stock + "," + cols[0].getText() + "," + cols[1].getText() + "\n")
                    print(stock + " " + cols[0].getText() + " " + cols[1].getText())
    
    f.close()
    

    确保将/path/to/chromedriver 替换为chromedriver 的适当路径。

    所以假设你的bselist.csv 包含:

    avanti-feeds-ltd/avanti/512573/
    

    您将获得以下输出:

    avanti-feeds-ltd/avanti/512573/ 52 Week High (adjusted) 999.00(13/11/2017)
    avanti-feeds-ltd/avanti/512573/ 52 Week Low (adjusted) 410.26(05/06/2018)
    avanti-feeds-ltd/avanti/512573/ 52 Week High (Unadjusted) 3,000.00(13/11/2017)
    avanti-feeds-ltd/avanti/512573/ 52 Week Low (Unadjusted) 507.00(02/07/2018)
    avanti-feeds-ltd/avanti/512573/ Month H/L 659.34/410.26
    avanti-feeds-ltd/avanti/512573/ Week H/L 615.00/507.00
    

    如果您还没有seleniumchromedriver,则需要先安装它。我在我的 mac 操作系统上安装了这些:

    sudo easy_install selenium
    sudo easy_install chromedriver
    

    您可能会发现以下帖子对您有所帮助:

    【讨论】:

    • 嗨朋友我收到错误 ModuleNotFoundError: No module named 'selenium'。花了一个多小时修复它,但徒劳无功。我正在使用 python 3.6.4 selenium==3.13.0 pip freeze 命令也可以正常工作。不知道如何解决。我在 Windows 10 上
    • 更新:非常感谢。我只是将代码复制粘贴到 cmd 窗口中,它的工作原理就像一个魅力,除了几个问题。所有 chrome 窗口都保持打开状态,我将不得不手动关闭它们。尽管我可以在屏幕上看到输出,但 csv 也没有被写入。我也收到诸如无法读取 VR 路径注册表之类的错误。
    • 任何其他不涉及每次调用 chrome 浏览器窗口的解决方案?正常的bs4不能处理这个??喜欢我写的代码?
    • 可能有一些方法不能打开 chrome windows,但我不知道。据我所知,普通的 bs4 无法从网页中提取动态内容。除了selenium 之外,可能还有其他模块可以实现相同的目标,但我不知道它们。一些谷歌搜索会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2020-03-13
    • 2012-10-04
    • 2017-08-21
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多