代码之家  ›  专栏  ›  技术社区  ›  Hamza Waheed

美化组或请求不阅读网页的某些部分

  •  2
  • Hamza Waheed  · 技术社区  · 7 年前

    我不熟悉网页抓取,从网页获取数据时遇到一些问题。

    我正在尝试阅读此网页: https://www.timeanddate.com/weather/pakistan/lahore/historic?month=7&year=2018

    并试图通过类wstext的div元素获取风速数据,但出于某种原因,请求库通过internet获取的页面不包含该特定类及其一些祖先。

    import requests
    import bs4 as bs
    import numpy as np
    
    wind = np.random.rand(120)
    dailyWindRecord = np.random.rand(30,4)
    
    html = requests.get('https://www.timeanddate.com/weather/pakistan/lahore/historic?month=7&year=2018')
    
    print(html.text)
    
    soup = bs.BeautifulSoup(html.content, 'html5lib')
    
    print(soup.prettify)
    
    windList = soup.findAll('div')
    print(windList)
    

    我曾尝试直接打印读取的html数据请求,并在通过beautifulsoup解析后打印,以查看html数据是否包含该类,但我找不到任何内容。任何帮助都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  3
  •   chitown88    7 年前

    熊猫可以为您完成工作,而不是使用bs4或请求:

    import numpy as np
    import pandas as pd
    
    wind = np.random.rand(120)
    dailyWindRecord = np.random.rand(30,4)
    
    url = 'https://www.timeanddate.com/weather/pakistan/lahore/historic?month=7&year=2018'
    
    tables = pd.read_html(url)
    
    table = tables[1]
    
    print (table.iloc[:,4])
    

    输出:

    print (table.iloc[:,4])
    0       3 mph
    1     No wind
    2     No wind
    3     No wind
    4     No wind
    5     No wind
    6     No wind
    7       3 mph
    8       5 mph
    9       6 mph
    10      5 mph
    11      5 mph
    12      6 mph
    13      5 mph
    14    No wind
    15      3 mph
    16    No wind
    17    No wind
    18    No wind
    19    No wind
    20      5 mph
    21    No wind
    22      6 mph
    23      6 mph
    24      5 mph
    25      6 mph
    26      7 mph
    27      7 mph
    28      7 mph
    29      3 mph
    30      3 mph
    31      3 mph
    32      3 mph
    33    No wind
    34      3 mph
    35      3 mph
    36    No wind
    37    No wind
    38        NaN
    Name: (Unnamed: 4_level_0, Wind), dtype: object
    

    备选案文2:

    您可以在html中找到并提取json结构,然后使用它。但是,当我尝试这样做时,它按小时列出了月份的数据,而不是一天的数据:

    import numpy as np
    import requests
    import bs4
    import json
    
    wind = np.random.rand(120)
    dailyWindRecord = np.random.rand(30,4)
    
    url = 'https://www.timeanddate.com/weather/pakistan/lahore/historic?month=7&year=2018'
    
    response = requests.get(url)
    
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    
    scripts = soup.find_all('script')
    jsonObj = None
    
    for script in scripts:
        if 'var data='  in script.text:
            jsonStr = script.text.strip()
    
            jsonStr = jsonStr.split('var data=')[1]
            jsonStr = jsonStr.split(';')[0]
    
            jsonObj = json.loads(jsonStr)
    
    for item in jsonObj['detail']:
        date = item['ds']
        wind = item['wind']
    
        print ('Date: %-40s   Wind: %s' %(date,wind) )
    

    输出:

    Date: Sunday, 1 July 2018, 00:00 — 06:00         Wind: 0.621
    Date: Sunday, 1 July 2018, 06:00 — 12:00         Wind: 3.728
    Date: Sunday, 1 July 2018, 12:00 — 18:00         Wind: 3.107
    Date: Sunday, 1 July 2018, 18:00 — 00:00         Wind: 3.107
    Date: Monday, 2 July 2018, 00:00 — 06:00         Wind: 1.864
    Date: Monday, 2 July 2018, 06:00 — 12:00         Wind: 5.593
    Date: Monday, 2 July 2018, 12:00 — 18:00         Wind: 8.7
    Date: Monday, 2 July 2018, 18:00 — 00:00         Wind: 9.943
    Date: Tuesday, 3 July 2018, 00:00 — 06:00        Wind: 10.564
    Date: Tuesday, 3 July 2018, 06:00 — 12:00        Wind: 11.185
    Date: Tuesday, 3 July 2018, 12:00 — 18:00        Wind: 9.943
    Date: Tuesday, 3 July 2018, 18:00 — 00:00        Wind: 6.214
    Date: Wednesday, 4 July 2018, 00:00 — 06:00      Wind: 6.836
    Date: Wednesday, 4 July 2018, 06:00 — 12:00      Wind: 4.971
    Date: Wednesday, 4 July 2018, 12:00 — 18:00      Wind: 6.214
    Date: Wednesday, 4 July 2018, 18:00 — 00:00      Wind: 3.728
    Date: Thursday, 5 July 2018, 00:00 — 06:00       Wind: 1.864
    Date: Thursday, 5 July 2018, 06:00 — 12:00       Wind: 1.864
    Date: Thursday, 5 July 2018, 12:00 — 18:00       Wind: 3.107
    Date: Thursday, 5 July 2018, 18:00 — 00:00       Wind: 3.107
    Date: Friday, 6 July 2018, 00:00 — 06:00         Wind: 1.864
    Date: Friday, 6 July 2018, 06:00 — 12:00         Wind: 6.214
    Date: Friday, 6 July 2018, 12:00 — 18:00         Wind: 6.836
    Date: Friday, 6 July 2018, 18:00 — 00:00         Wind: 3.728
    Date: Saturday, 7 July 2018, 00:00 — 06:00       Wind: 1.243
    Date: Saturday, 7 July 2018, 06:00 — 12:00       Wind: 2.486
    Date: Saturday, 7 July 2018, 12:00 — 18:00       Wind: 6.836
    Date: Saturday, 7 July 2018, 18:00 — 00:00       Wind: 2.486
    Date: Sunday, 8 July 2018, 00:00 — 06:00         Wind: 3.107
    Date: Sunday, 8 July 2018, 06:00 — 12:00         Wind: 6.214
    Date: Sunday, 8 July 2018, 12:00 — 18:00         Wind: 5.593
    Date: Sunday, 8 July 2018, 18:00 — 00:00         Wind: 4.35
    Date: Monday, 9 July 2018, 00:00 — 06:00         Wind: 5.593
    Date: Monday, 9 July 2018, 06:00 — 12:00         Wind: 5.593
    Date: Monday, 9 July 2018, 12:00 — 18:00         Wind: 6.214
    Date: Monday, 9 July 2018, 18:00 — 00:00         Wind: 4.35
    Date: Tuesday, 10 July 2018, 00:00 — 06:00       Wind: 6.836
    Date: Tuesday, 10 July 2018, 06:00 — 12:00       Wind: 8.078
    Date: Tuesday, 10 July 2018, 12:00 — 18:00       Wind: 6.836
    Date: Tuesday, 10 July 2018, 18:00 — 00:00       Wind: 5.593
    Date: Wednesday, 11 July 2018, 00:00 — 06:00     Wind: 6.214
    Date: Wednesday, 11 July 2018, 06:00 — 12:00     Wind: 12.428
    Date: Wednesday, 11 July 2018, 12:00 — 18:00     Wind: 8.078
    Date: Wednesday, 11 July 2018, 18:00 — 00:00     Wind: 5.593
    Date: Thursday, 12 July 2018, 00:00 — 06:00      Wind: 4.971
    Date: Thursday, 12 July 2018, 06:00 — 12:00      Wind: 8.078
    Date: Thursday, 12 July 2018, 12:00 — 18:00      Wind: 7.457
    Date: Thursday, 12 July 2018, 18:00 — 00:00      Wind: 6.214
    Date: Friday, 13 July 2018, 00:00 — 06:00        Wind: 5.593
    Date: Friday, 13 July 2018, 06:00 — 12:00        Wind: 11.807
    Date: Friday, 13 July 2018, 12:00 — 18:00        Wind: 9.321
    Date: Friday, 13 July 2018, 18:00 — 00:00        Wind: 5.593
    Date: Saturday, 14 July 2018, 00:00 — 06:00      Wind: 4.971
    Date: Saturday, 14 July 2018, 06:00 — 12:00      Wind: 4.971
    Date: Saturday, 14 July 2018, 12:00 — 18:00      Wind: 6.214
    Date: Saturday, 14 July 2018, 18:00 — 00:00      Wind: 6.214
    Date: Sunday, 15 July 2018, 00:00 — 06:00        Wind: 8.7
    Date: Sunday, 15 July 2018, 06:00 — 12:00        Wind: 8.7
    Date: Sunday, 15 July 2018, 12:00 — 18:00        Wind: 8.7
    Date: Sunday, 15 July 2018, 18:00 — 00:00        Wind: 5.593
    Date: Monday, 16 July 2018, 00:00 — 06:00        Wind: 4.971
    Date: Monday, 16 July 2018, 06:00 — 12:00        Wind: 11.185
    Date: Monday, 16 July 2018, 12:00 — 18:00        Wind: 11.185
    Date: Monday, 16 July 2018, 18:00 — 00:00        Wind: 8.7
    Date: Tuesday, 17 July 2018, 00:00 — 06:00       Wind: 7.457
    Date: Tuesday, 17 July 2018, 06:00 — 12:00       Wind: 8.078
    Date: Tuesday, 17 July 2018, 12:00 — 18:00       Wind: 6.836
    Date: Tuesday, 17 July 2018, 18:00 — 00:00       Wind: 4.971
    Date: Wednesday, 18 July 2018, 00:00 — 06:00     Wind: 3.728
    Date: Wednesday, 18 July 2018, 06:00 — 12:00     Wind: 2.486
    Date: Wednesday, 18 July 2018, 12:00 — 18:00     Wind: 6.214
    Date: Wednesday, 18 July 2018, 18:00 — 00:00     Wind: 4.971
    Date: Thursday, 19 July 2018, 00:00 — 06:00      Wind: 4.971
    Date: Thursday, 19 July 2018, 06:00 — 12:00      Wind: 5.593
    Date: Thursday, 19 July 2018, 12:00 — 18:00      Wind: 6.214
    Date: Thursday, 19 July 2018, 18:00 — 00:00      Wind: 1.864
    Date: Friday, 20 July 2018, 00:00 — 06:00        Wind: 2.486
    Date: Friday, 20 July 2018, 06:00 — 12:00        Wind: 5.593
    Date: Friday, 20 July 2018, 12:00 — 18:00        Wind: 8.078
    Date: Friday, 20 July 2018, 18:00 — 00:00        Wind: 3.728
    Date: Saturday, 21 July 2018, 00:00 — 06:00      Wind: 0.621
    Date: Saturday, 21 July 2018, 06:00 — 12:00      Wind: 1.243
    Date: Saturday, 21 July 2018, 12:00 — 18:00      Wind: 2.486
    Date: Saturday, 21 July 2018, 18:00 — 00:00      Wind: 7.457
    Date: Sunday, 22 July 2018, 00:00 — 06:00        Wind: 4.971
    Date: Sunday, 22 July 2018, 06:00 — 12:00        Wind: 6.836
    Date: Sunday, 22 July 2018, 12:00 — 18:00        Wind: 4.35
    Date: Sunday, 22 July 2018, 18:00 — 00:00        Wind: 4.35
    Date: Monday, 23 July 2018, 00:00 — 06:00        Wind: 2.486
    Date: Monday, 23 July 2018, 06:00 — 12:00        Wind: 6.214
    Date: Monday, 23 July 2018, 12:00 — 18:00        Wind: 6.836
    Date: Monday, 23 July 2018, 18:00 — 00:00        Wind: 4.971
    Date: Tuesday, 24 July 2018, 00:00 — 06:00       Wind: 3.107
    Date: Tuesday, 24 July 2018, 06:00 — 12:00       Wind: 7.457
    Date: Tuesday, 24 July 2018, 12:00 — 18:00       Wind: 4.35
    Date: Tuesday, 24 July 2018, 18:00 — 00:00       Wind: 2.486
    Date: Wednesday, 25 July 2018, 00:00 — 06:00     Wind: 1.243
    Date: Wednesday, 25 July 2018, 06:00 — 12:00     Wind: 3.728
    Date: Wednesday, 25 July 2018, 12:00 — 18:00     Wind: 6.836
    Date: Wednesday, 25 July 2018, 18:00 — 00:00     Wind: 7.457
    Date: Thursday, 26 July 2018, 00:00 — 06:00      Wind: 7.457
    Date: Thursday, 26 July 2018, 06:00 — 12:00      Wind: 9.321
    Date: Thursday, 26 July 2018, 12:00 — 18:00      Wind: 11.185
    Date: Thursday, 26 July 2018, 18:00 — 00:00      Wind: 7.457
    Date: Friday, 27 July 2018, 00:00 — 06:00        Wind: 6.836
    Date: Friday, 27 July 2018, 06:00 — 12:00        Wind: 5.593
    Date: Friday, 27 July 2018, 12:00 — 18:00        Wind: 4.35
    Date: Friday, 27 July 2018, 18:00 — 00:00        Wind: 4.35
    Date: Saturday, 28 July 2018, 00:00 — 06:00      Wind: 3.728
    Date: Saturday, 28 July 2018, 06:00 — 12:00      Wind: 6.214
    Date: Saturday, 28 July 2018, 12:00 — 18:00      Wind: 1.864
    Date: Saturday, 28 July 2018, 18:00 — 00:00      Wind: 3.728
    Date: Sunday, 29 July 2018, 00:00 — 06:00        Wind: 3.107
    Date: Sunday, 29 July 2018, 06:00 — 12:00        Wind: 6.836
    Date: Sunday, 29 July 2018, 12:00 — 18:00        Wind: 5.593
    Date: Sunday, 29 July 2018, 18:00 — 00:00        Wind: 2.486
    Date: Monday, 30 July 2018, 00:00 — 06:00        Wind: 1.864
    Date: Monday, 30 July 2018, 06:00 — 12:00        Wind: 3.728
    Date: Monday, 30 July 2018, 12:00 — 18:00        Wind: 4.971
    Date: Monday, 30 July 2018, 18:00 — 00:00        Wind: 2.486
    Date: Tuesday, 31 July 2018, 00:00 — 06:00       Wind: 1.243
    Date: Tuesday, 31 July 2018, 06:00 — 12:00       Wind: 6.836
    Date: Tuesday, 31 July 2018, 12:00 — 18:00       Wind: 6.836
    Date: Tuesday, 31 July 2018, 18:00 — 00:00       Wind: 3.107
    

    下面是json格式的详细说明 wind

    enter image description here

        2
  •  2
  •   Alex Yu    7 年前

    我的探索和非常非常肮脏的“解决方案”的问题

    1.漂亮的泡泡糖很好

    pandas solution -它很好用。

    看看 pandas source -我们看到熊猫正在使用 _BeautifulSoupHtml5LibFrameParser .

    2.带卷曲的“本质脏的解决方案”

    让我们试试看 curl

    $ curl https://www.timeanddate.com/weather/pakistan/lahore/historic\?month\=7\&year\=2018 > result.html   
    $ less result.html
    

    我们在这里看到:

    </script><script type="text/javascript">
    var data={"copyright":"Contents are strictly for use by 
    timeanddate.com","units": 
    {"temp":"°C","prec":"mm","wind":"km\/h","baro":"mbar"},
    "temp":        
    [{"date":15304047E5,"temp":29},{"date":15304065E5,"temp":29},  
    {"date":15304083E5,"temp":29},{"date":15304101E5,"temp":28},
    ...
    

    我想是OP在寻找数据。

    3.可能的解决办法

    1. 以某种方式下载url。 curl / wget / requests -一切都必须好起来
    2. 从下载的html摘录 var data . python str
    3. json.loads data
    4. 完成

    as is <table> .

    附笔。

    pandas -解决方案。

    因为 熊猫

    但解决这个问题并不需要熊猫。

    推荐文章