Python的解析HTML用转义字符

时间:2019-02-02 19:44:00

标签: python html beautifulsoup escaping html-parsing

我正在尝试从网站上抓取数据,但是数据表是由JavaScript呈现的。我没有使用Selenium之类的工具来生成页面并运行脚本,而是找到了存储数据的script标签,并试图直接从那里提取数据。

代码如下:

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,但是似乎转义字符没有被正确地转义

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 :(得分:1)

在我看来,您只需要取消对字符串"中的/s值进行转义,然后可以成功地使用bs4解析标记:< / p>

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%
...