Очистить таблицу от HTML (<tr> и метод ID не работает) - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я пытаюсь выполнить очистку таблицы с этого веб-сайта: http://pusatdata.kontan.co.id/reksadana/produk/469/Schroder-90-Plus-Equity-Fund

В частности, серый стол с заголовками «TANGGAL / NAB / DIVIDEN / DAILY RETURN (%)».

Ниже приведен код, который я использую:

import requests
import urllib.request
from bs4 import BeautifulSoup

quote_page = "http://pusatdata.kontan.co.id/reksadana/produk/469/Schroder-90-Plus-Equity-Fund"

page = urllib.request.urlopen(quote_page)

soup = BeautifulSoup(page, "html.parser")

table = soup.find('div',id='table_flex')

print (table.text)

Но вывод не был сгенерирован вообще. Ценю твою помощь. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Не было сгенерировано вывода, потому что в <div> нет текста с идентификатором table_flex. Так что это не должно быть сюрпризом.

«Таблица», о которой идет речь, находится под <div> с идентификатором manajemen_reksadana. Две строки не находятся непосредственно под этим <div>, и вся «таблица» состоит из <div> с, поэтому лучше перейти к известным текстам заголовка / метки и обратиться к <div>, содержащему значение относительно <div> с текстом заголовка / метки:

fund_management_node = soup.find('div', id='manajemen_reksadana')
for label_text in ['PRODUK', 'KATEGORI', 'NAB', 'DAILY RETURN']:
    label_node = fund_management_node.find(text=label_text).parent
    print(label_node.find_next_sibling('div').text)
0 голосов
/ 09 мая 2018

Когда вы не получаете ожидаемых результатов от своего кода, вам нужно вернуться назад, чтобы выяснить, где ваш код сломался.

В этом случае вашим первым шагом будет проверка значения таблицы. Как выясняется, таблица не является None (что означало бы неправильный вызов селектора / soup.find), так что вы, по крайней мере, знаете, что вы правильно поняли.

Вместо этого вы заметите, что div table_flex пуст. Это не очень удивительно для меня, но давайте представим, что я ничего не знаю, и это не имеет никакого смысла. Поэтому следующим шагом будет запуск браузера и повторная проверка того, что DOM (через инструмент проверки вашего браузера) имеет содержимое в div table_flex.

Да, так что теперь вам нужно по-настоящему копать. Если вы выполните простой поиск в DOM в окне проверки «table_flex», вы сначала увидите div, о котором мы уже знаем, но затем вы увидите некоторый Javascript / jQuery ниже по странице, которая ссылается на «#table_flex». ».

Этот Javascript является частью вызова $ .ajax () (который вы могли бы найти в Google и выяснить, это в основном запрос к веб-серверу для получения информации). Вы также заметите, что $ ("# table_flex") имеет метод html () (который, как вы обнаружите, после большего количества поиска в Google устанавливает html-контент для определенного элемента).

И теперь у нас есть ваш ответ о том, почему div пуст: когда веб-сервер запрашивает эту страницу, сервер отправляет обратно документ с пустой таблицей. Ожидается, что запрашивающая сторона выполнит Javascript для заполнения остальной части страницы. Вообще говоря, модули Python не запускают Javascript (по нескольким причинам), поэтому таблица никогда не заполняется.

Это, как правило, стандартная рабочая процедура для динамического контента, поскольку веб-страницы «шаблона» могут кэшироваться и быстро распространяться (поскольку никакой дополнительной информации не требуется), а затем остальная информация предоставляется по мере необходимости. Это также позволяет использовать один и тот же документ для нескольких URL-адресов и аргументов запроса без необходимости создания новых документов.

В конечном счете, вам, вероятно, будет проще всего определить, можете ли вы самостоятельно получить доступ к этому API и просто запросить этот URL вместо этого.

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