Перечислите ссылки на файлы xls, используя Beautifulsoup - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь получить список загружаемых xls файлов на веб-сайте.Я неохотно предоставляю полные ссылки на данный веб-сайт.Надеюсь, я смогу предоставить все необходимые детали.Если это бесполезно, пожалуйста, дайте мне знать.

Загрузите файлы .xls с веб-страницы, используя Python, и BeautifulSoup - это очень подобный вопрос, но детали ниже приведутпокажите, что решение, скорее всего, должно быть другим, поскольку ссылки на этом конкретном сайте помечены href якорем:

enter image description here

Ите, которые я пытаюсь получить, не помечены одинаково.


На веб-странице файлы, доступные для скачивания, перечислены следующим образом:

enter image description here

Простой указатель мыши дает следующие подробности:

enter image description here

Я следую настройке здесь с некоторыми изменениями для получения приведенного ниже фрагмента, который содержит список некоторых ссылок, но не на любой из файлов xls:

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 в Google Chrome показывает, что эти конкретные ссылки не имеют тега привязки href, а ng-href тег привязки:

enter image description here

Поэтому я попытался изменить это в приведенном выше фрагменте, но безуспешно.

И я 'мы пробовали разные комбинации с 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, это то, что я вижу при наведении курсора на одну из ссылок, перечисленных выше:

enter image description here

И вот что я хочу извлечь - это информация, связанная с тегом ng-href.Но если я щелкну правой кнопкой мыши на странице и выберу «Показать источник», один и тот же тег появится только один раз вместе с метаданными сома (?):

enter image description here

И ядумаю, именно поэтому мой довольно простой подход потерпел неудачу.

Я надеюсь, что это имеет смысл для некоторых из вас.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Обновление:

с использованием селена

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://но косая черта /, которую можно попробовать с помощью регулярного выражения, содержит .xls

for link in soup.findAll('a', attrs={'ng-href': re.compile(r"\.xls")}):
    xls_link = "https://SOMEWEBSITE" + link['ng-href']
    print(xls_link)
    links.append(xls_link)
0 голосов
/ 06 декабря 2018

Я предполагаю, что данные, которые вы пытаетесь сканировать, создаются динамически: ng-href является одной из конструкций AngularJ.Вы можете попытаться использовать проверку сети в Google Chrome, как вы это уже делали (ctrl+shift+I), и посмотреть, сможете ли вы найти запрашиваемый URL (откройте вкладку сети и перезагрузите страницу).Запрос обычно должен возвращать JSON со ссылками на xls-файлы.

Здесь есть тема о подобной проблеме.Возможно, это поможет вам: Невозможно отсканировать некоторые href на веб-странице, используя python и beautifulsoup

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...