我正在尝试检索网站上可下载的xls
文件的列表。
我有点不愿提供有关网站的完整链接。
希望我能够提供所有必要的细节。
如果这没用,请告诉我。
Download .xls files from a webpage using Python and BeautifulSoup是一个非常问题,但是下面的详细信息将显示解决方案很有可能必须有所不同,因为该特定站点上的链接都用{{ 1}}锚点:
我尝试获取的标签没有以相同的方式标记。
在网页上,列出了可供下载的文件,如下所示:
简单的鼠标悬停可以提供以下详细信息:
我正在按照设置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
定位标记:
因此,我尝试在上面的代码段中进行更改,但没有成功。
我曾尝试使用ng-href
,e.compile("^https://")
和attrs={'ng-href'
进行不同的组合,但仍然没有成功。
所以我希望有人提出更好的建议!
编辑-详细信息
直接阅读这些链接似乎有点麻烦。
当我使用links.append(link.get('ng-href'))
和ctrl+shift+I
时,将鼠标悬停在上面列出的链接之一上时,便可以看到以下内容:
我想在这里提取的是与Select an element in the page to inspect it Ctrl+Shift+C
标记相关的信息。但是,如果我右键单击该页面并选择“显示源”,则同一标记只会与som元数据(?)一起出现一次:
我想这就是为什么我的基本方法首先会失败的原因。
我希望这对你们中的某些人有意义。
答案 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