Создание файла CSV из HTML, который не имеет элемента таблицы для использования с BeautifulSoup - PullRequest
0 голосов
/ 30 апреля 2018

Заранее благодарю за любую помощь. У меня есть текущий CSV исторических данных, связанных с URL CFTC: https://www.cftc.gov/dea/options/other_lof.htm

Я хочу создать скрипт для извлечения данных с этого сайта раз в неделю и автоматического обновления моих CSV исторических данных. В настоящее время я застрял при попытке импортировать только данные "Random Length Lumber" в новый CSV. HTML-код выглядит так:

<code>        <pre> <!--ih:includeHTML file="other_lof.txt"-->PALLADIUM - NEW YORK MERCANTILE EXCHANGE... # It then continues listing ALL data from all of the commodities 


<!--/ih:includeHTML-->
    

и продолжает перечислять все данные по всем товарам.

Мой код Python начинается так:

from bs4 import BeautifulSoup
import urllib.request


page = urllib.request.urlopen(url)
soup = BeautifulSoup(page, 'lxml')
# table = soup.find('')

Здесь я хотел бы получить доступ только к данным Lumber и экспортировать их в Excel, однако пока я не могу выбрать нужные данные, я не хочу записывать все данные в Excel. Любая помощь или руководство будет принята с благодарностью. Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

URL, который вы указали, не в формате CSV, это простой отчет в формате таблицы ascii.

cftc.gov предоставляет комбинированный отчет «Дезагрегированные фьючерсные и опционные обязательства» в простом формате CSV для всех товаров здесь:

https://www.cftc.gov/dea/newcot/c_disagg.txt

и здесь вы можете найти имена полей для такого отчета:

https://www.cftc.gov/MarketReports/CommitmentsofTraders/HistoricalViewable/CFTC_023168

Вот пример кода Python для анализа этих деталей:

import requests, csv, lxml.etree, io


def get_dissag():
    output = []

    feed_url = 'https://www.cftc.gov/dea/newcot/c_disagg.txt'
    fields_url = 'https://www.cftc.gov/MarketReports/CommitmentsofTraders/HistoricalViewable/CFTC_023168'

    fields_response = requests.get(fields_url)
    doc = lxml.etree.HTML(fields_response.content.decode())
    header = [field.split(' ')[1] for field in doc.xpath("//td/p/text()")]

    response = requests.get(feed_url)
    f = io.StringIO(response.content.decode())
    csv_reader = csv.reader(f)

    for row in csv_reader:
        row_dict = {}
        for index, value in enumerate(row):
            row_dict[header[index]] = value.strip()
        output.append(row_dict)

    return output


print(get_dissag())
0 голосов
/ 30 апреля 2018

После получения исходного кода HTML-страницы попробуйте извлечь все элементы тега списка из источника, как правило, оглавление готовится с использованием тега 'li' в HTML. Изучите исходный код и выясните класс тега списка, который используется для уникальной идентификации элемента

tr = soup.findChildren('li',class_= "toclevel-1")
for item in tr:
    print(item.text)

enter image description here

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