【问题标题】:Trouble downloading xlsx file from website - Scraping从网站下载 xlsx 文件时遇到问题 - 抓取
【发布时间】:2017-01-14 03:48:02
【问题描述】:

我正在尝试编写一些代码来下载位于http://www.eirgridgroup.com/customer-and-industry/general-customer-information/outage-information/底部的两个最新出版物的停电周

这是 xlsx 文件,之后我将加载到 Excel 中。 代码是用哪种编程语言编写的并不重要。

我的第一个想法是使用直接网址,例如http://www.eirgridgroup.com/site-files/library/EirGrid/Outage-Weeks_36(2016)-51(2016)_31%20August.xlsx ,然后编写一些代码来猜测两个最新出版物的 url。 但是我注意到 url 名称中有一些不一致的地方,因此该解决方案不起作用。

相反,它可能是抓取网站并使用 XPath 下载文件的解决方案。我发现这两个最新的出版物总是有以下 XPath:

/html/body/div[3]/div[3]/div/div/p[5]/a
/html/body/div[3]/div[3]/div/div/p[6]/a

这是我需要帮助的地方。我是 XPath 和 Web Scraping 的新手。我在 Python 中尝试过类似的东西

from lxml import html
import requests

page = requests.get('http://www.eirgridgroup.com/customer-and-industry/general-customer-information/outage-information/')
tree = html.fromstring(page.content)

v = tree.xpath('/html/body/div[3]/div[3]/div/div/p[5]/a')

但是 v 似乎是空的。

任何想法将不胜感激!

【问题讨论】:

    标签: python vba xpath import web-scraping


    【解决方案1】:

    只需使用 contains 找到 hrefs 并将前两个切片:

     tree.xpath('//p/a[contains(@href, "/site-files/library/EirGrid/Outage-Weeks")]/@href')[:2]
    

    或者使用 [position() < 3] 使用 xpath 完成所有操作:

    tree.xpath'(//p/a[contains(@href, "site-files/library/EirGrid/Outage-Weeks")])[position() < 3]/@href')
    

    文件按从最新到最旧的顺序排列,因此获取前两个即可获得最新的两个。

    要下载文件,您只需将每个 href 加入基本 url 并将内容写入文件:

    from lxml import html
    import requests
    import os
    from urlparse import urljoin # from urllib.parse import urljoin
    
    
    page = requests.get('http://www.eirgridgroup.com/customer-and-industry/general-customer-information/outage-information/')
    tree = html.fromstring(page.content)
    
    v = tree.xpath('(//p/a[contains(@href, "/site-files/library/EirGrid/Outage-Weeks")])[position() < 3]/@href')
    for href in v:
        # os.path.basename(href) -> Outage-Weeks_35(2016)-50(2016).xlsx 
        with open(os.path.basename(href), "wb") as f:
            f.write(requests.get(urljoin("http://www.eirgridgroup.com", link)).content)
    

    【讨论】:

    • 太棒了!非常感谢@PadraicCunningham!我真的一点头绪都没有。 :) 现在只是最后一个问题。我如何存储现在存储在 v 中的两个 xlsx 文件?
    • @JSkjold,你的意思是下载吗?
    • 是的,@PadraicCunningham。不过没关系,我想通了。但再次感谢!干杯
    • 没问题,第二个 sn-p 还是可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2021-06-04
    相关资源
    最近更新 更多