【问题标题】:Scraping data from multiple html tables within one website in python用python从一个网站内的多个html表中抓取数据
【发布时间】:2014-09-21 13:24:50
【问题描述】:

我正在尝试从这个网站获取时间序列到 python:http://www.boerse-frankfurt.de/en/etfs/db+x+trackers+msci+world+information+technology+trn+index+ucits+etf+LU0540980496/price+turnover+history/historical+data#page=1

我已经走了很远,但不知道如何获取所有数据,而不仅仅是您可以在页面上看到的前 50 行。要在线查看它们,您必须单击表格底部的结果。我希望能够在 python 中指定开始和结束日期,并在列表中获取所有相应的日期和价格。这是我目前所拥有的:

 from bs4 import BeautifulSoup
 import requests
 import lxml
 import re

 url = 'http://www.boerse-frankfurt.de/en/etfs/db+x+trackers+msci+world+information+technology+trn+index+ucits+etf+LU0540980496/price+turnover+history/historical+data'
 soup = BeautifulSoup(requests.get(url).text)

 dates  = soup.findAll('td', class_='column-date')
 dates  = [re.sub('[\\nt\s]','',d.string) for d in dates]
 prices = soup.findAll('td', class_='column-price')
 prices = [re.sub('[\\nt\s]','',p.string) for p in prices]

【问题讨论】:

    标签: python html parsing web beautifulsoup


    【解决方案1】:

    您需要循环浏览其余页面。您可以使用 POST 请求来执行此操作。服务器期望在每个 POST 请求中接收一个结构。该结构在下面的values 中定义。页码是该结构的参数'page'。该结构有几个我没有测试过的参数,但尝试一下可能会很有趣,例如 items_per_pagema​​x_timemin_time。下面是一个示例代码:

    from bs4 import BeautifulSoup
    import urllib
    import urllib2
    import re
    
    url = 'http://www.boerse-frankfurt.de/en/parts/boxes/history/_histdata_full.m'
    values = {'COMPONENT_ID':'PREeb7da7a4f4654f818494b6189b755e76', 
        'ag':'103708549', 
        'boerse_id': '12',
        'include_url': '/parts/boxes/history/_histdata_full.m',
        'item_count': '96',
        'items_per_page': '50',
        'lang': 'en',
        'link_id': '',
        'max_time': '2014-09-20',
        'min_time': '2014-05-09',
        'page': 1,
        'page_size': '50',
        'pages_total': '2',
        'secu': '103708549',
        'template': '0',
        'titel': '',
        'title': '',
        'title_link': '',
        'use_external_secu': '1'}
    
    dates = []
    prices = []
    while True:
        data = urllib.urlencode(values)
        request = urllib.urlopen(url, data)
        soup = BeautifulSoup(request.read())
        temp_dates  = soup.findAll('td', class_='column-date')
        temp_dates  = [re.sub('[\\nt\s]','',d.string) for d in temp_dates]
        temp_prices = soup.findAll('td', class_='column-price')
        temp_prices = [re.sub('[\\nt\s]','',p.string) for p in temp_prices]
        if not temp_prices:
            break
        else:
            dates = dates + temp_dates
            prices = prices + temp_prices
            values['page'] += 1
    

    【讨论】:

    • 非常感谢,这看起来正是我正在寻找的。不过有两个问题:你知道如何让它在 python3 中工作吗?我用过data = urllib.parse.urlencode(values) request = urllib.request.urlopen(url, data.encode('ascii')) soup = BeautifulSoup(request.read()),但这不起作用(我一遍又一遍地得到相同的日期和价格,循环永远不会终止)。另外,您最初是如何提出值 dict 的?
    • 您可以找到使用 Python 3 和 urllib 的 POST 请求示例 here. 我认为您需要先创建一个 Request 对象:data = urllib.parse.urlencode(values) request = urllib.request.Request(url, data) response = urllib.request.urlopen(request) soup = BeautifulSoup(response.read())。我使用 FireBug 提取了 dict 值,FireBug 是一个 Firefox 扩展,可让您在浏览器中查看 HTTP 请求的内容。
    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多