Python анализирует HTML с помощью escape-символов - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь очистить данные с веб-сайта, но таблица данных отображается с помощью JavaScript.Вместо того чтобы использовать такой инструмент, как Selenium, для генерации страницы и запуска сценария, я вместо этого нашел тег сценария, в котором хранятся данные, и пытаюсь извлечь данные непосредственно оттуда.

Вот код:

import requests
from bs4 import BeautifulSoup
import json

url = 'https://www.etf.com/SPY'

result = requests.get(url)

c = result.content
html = BeautifulSoup(c, 'html.parser')

script = html.find_all('script')[-22]   #this is the script tag that has the data

script = script.contents

js = script[0]
data = js[31:-2]  #data is the json/dict which has the data

Это фрагмент того, как выглядит содержимое данных:

enter image description here

s = json.loads(data)

s = s['etf_report_from_api']['modalInfoToActive']['top10Holdings']['data']

s = s[13:-2]

Вот фрагмент кода, который выглядит следующим образом:

enter image description here

На данный момент содержимое больше похоже на HTML, нопохоже, что escape-символы не были экранированы должным образом

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()

Вот вывод синтаксического анализатора.кажется, что он может распознавать некоторые теги, но идентифицирует другие как данные из-за проблемы форматирования.

enter image description here

Эти данные по сути являются таблицей HTML,но как я могу правильно декодировать / анализировать его для извлечения содержимого данных?

1 Ответ

0 голосов
/ 02 февраля 2019

Мне кажется, вам просто нужно удалить значения " и / в вашей строке s, и тогда вы сможете успешно проанализировать разметку с помощью bs4:

soup = BeautifulSoup(s.replace(r"\"", '"').replace(r"\/", "/"), "html.parser")

for row in soup.find_all("tr"):
    name, value = row.find_all("td")
    print(f"{name.text}\t{value.text}")

Результат:

Microsoft Corporation   3.55%
Apple Inc.  3.31%
Amazon.com, Inc.    3.11%
Facebook, Inc. Class A  1.76%
Berkshire Hathaway Inc. Class B 1.76%
...
...