尝试从网页将JS数据输出到.html输出文件

时间:2019-06-10 00:58:25

标签: python html json python-3.x beautifulsoup

我已经成功地将JS列出的网站刮到了本地.html文件中,但是输出不足。

问题是:

  • 它仅产生最后一个查询(audioSource),而不产生其他请求
  • 它仅找到第1集,并在此处停止。如何重复直到找到终点?

非常感谢

import requests
import json
from bs4 import BeautifulSoup

JSONDATA = requests.request("GET", "https://thisiscriminal.com/wp-json/criminal/v1/episodes?posts=1000000&page=1")
JSONDATA = JSONDATA.json()

for line in JSONDATA['posts']:
    soup = BeautifulSoup(line['episodeNumber'],'lxml')
    soup = BeautifulSoup(line['title'],'lxml')
    soup = BeautifulSoup(line['image']['large'],'lxml')
    soup = BeautifulSoup(line['excerpt']['long'],'lxml')
    soup = BeautifulSoup(line['audioSource'],'lxml')
with open("output1.html", "w") as file:
    file.write(str(soup))

2 个答案:

答案 0 :(得分:1)

这里的问题是:

  1. 在写入时使用w,它将整个文件替换为更新的文本。
  2. 对所有值使用相同的变量名soup
  3. 这里不需要bs4模块来解析json数据。

您可以做的是:

安装pandas模块并创建一个数据框。 使用 pip pip install pandas conda conda install pandas安装它。

然后,您可以使用dataframe并随意使用它。

import requests
import json
import pandas as pd
import os

JSONDATA = requests.request("GET", "https://thisiscriminal.com/wp-json/criminal/v1/episodes?posts=1000000&page=1")
JSONDATA = JSONDATA.json()

df = pd.DataFrame(JSONDATA)

filename = 'Output.txt'
os.mknod(filename) #create the filename above.

with open(filename, 'a') as fopen:
    for i in range(len(df)):
        fopen.writelines(df.posts[i]['episodeNumber']+'\n')
        fopen.writelines(df.posts[i]['title']+'\n')
        fopen.writelines(df.posts[i]['image']['large']+'\n')
        fopen.writelines(df.posts[i]['excerpt']['long']+'\n')
        fopen.writelines(df.posts[i]['audioSource']+'\n')
        fopen.writelines("\n")
fopen.close()

这是您想要的完整代码。
另外,您可以使用print(df.head())来查看数据框如何将值存储为字典并执行更多操作。

输出: enter image description here

您可以看到整个文本here

答案 1 :(得分:1)

使用pandas库,将数据保存到当前项目目录的CSV文件中

import requests
import pandas as pd

resp = requests.get("https://thisiscriminal.com/wp-json/criminal/v1/episodes?posts=1000000&page=1").json()
df = pd.DataFrame(resp['posts'], columns=['episodeNumber', 'title', 'image','excerpt','audioSource'])
#it will save data into post csv file and stored in current project directory
df.to_csv("posts.csv")