使用Beautifulsoup列出xls文件的链接

时间:2018-12-06 10:40:33

标签: python beautifulsoup

我正在尝试检索网站上可下载的xls文件的列表。 我有点不愿提供有关网站的完整链接。 希望我能够提供所有必要的细节。 如果这没用,请告诉我。

Download .xls files from a webpage using Python and BeautifulSoup是一个非常问题,但是下面的详细信息将显示解决方案很有可能必须有所不同,因为该特定站点上的链接都用{{ 1}}锚点:

enter image description here

我尝试获取的标签没有以相同的方式标记。


在网页上,列出了可供下载的文件,如下所示:

enter image description here

简单的鼠标悬停可以提供以下详细信息:

enter image description here

我正在按照设置here进行一些更改,以生成下面的代码段,该代码段提供了 some 链接的列表,但未提供任何href文件的链接:

xls

在Google Chrome浏览器中使用from bs4 import BeautifulSoup import urllib import re def getLinks(url): with urllib.request.urlopen(url) as response: html = response.read() soup = BeautifulSoup(html, "lxml") links = [] for link in soup.findAll('a', attrs={'href': re.compile("^http://")}): links.append(link.get('href')) return links links1 = getLinks("https://SOMEWEBSITE") 进行的进一步检查显示,这些特定链接没有ctrl+shift+I定位标记,而是href定位标记:

enter image description here

因此,我尝试在上面的代码段中进行更改,但没有成功。

我曾尝试使用ng-hrefe.compile("^https://")attrs={'ng-href'进行不同的组合,但仍然没有成功。

所以我希望有人提出更好的建议!


编辑-详细信息

直接阅读这些链接似乎有点麻烦。 当我使用links.append(link.get('ng-href'))ctrl+shift+I时,将鼠标悬停在上面列出的链接之一上时,便可以看到以下内容:

enter image description here

我想在这里提取的是与Select an element in the page to inspect it Ctrl+Shift+C标记相关的信息。但是,如果我右键单击该页面并选择“显示源”,则同一标记只会与som元数据(?)一起出现一次:

enter image description here

我想这就是为什么我的基本方法首先会失败的原因。

我希望这对你们中的某些人有意义。

2 个答案:

答案 0 :(得分:1)

我的猜测是,您要爬网的数据是动态创建的:ng-href是AngularJs的构造之一。您可以像以前一样尝试使用Google Chrome的网络检查(ctrl+shift+I),看看是否可以找到查询的网址(打开“网络”标签,然后重新加载页面)。查询通常应返回包含指向xls文件的链接的JSON。

这里有一个关于类似问题的话题。也许对您有帮助:Unable to crawl some href in a webpage using python and beautifulsoup

答案 1 :(得分:1)

更新:

使用硒

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait 

driver = webdriver.Chrome()
driver.get('http://.....')

# wait max 15 second until the links appear
xls_links = WebDriverWait(driver, 15).until(lambda d: d.find_elements_by_xpath('//a[contains(@ng-href, ".xls")]'))
# Or
# xls_links = WebDriverWait(driver, 15).until(lambda d: d.find_elements_by_xpath('//a[contains(@href, ".xls")]'))

links = []
for link in xls_links:
    url = "https://SOMEWEBSITE" + link.get_attribute('ng-href')
    print(url)
    links.append(url)

假设ng-href不是动态生成的,从您的最后一张图片中,我看到该URL不是以https://开头,而是您可以尝试使用正则表达式URL的斜杠/包含{{1 }}

.xls