экспорт HTML-данных в формате json

#python #json #pandas

#python #json #панды

Вопрос:

Рассмотрим этот простой пример

 import pandas as pd
import numpy as np
import requests
from bs4 import BeautifulSoup

df = pd.DataFrame({'link' : ['https://en.wikipedia.org/wiki/World's_funniest_joke',
                             'https://en.wikipedia.org/wiki/The_Funniest_Joke_in_the_World']})

def puller(mylink):
    doc = requests.get(mylink)
    return BeautifulSoup(doc.content, 'html5lib')

df['parsed'] = df.link.apply(lambda x: puller(x))
 

Это правильно извлекает HTML-информацию страниц Википедии в dataframe. Мне нужно сохранить этот фрейм данных для последующего использования. К сожалению, parsed столбец исчезает при экспорте в json .

  df
Out[32]: 
                                                           link  
0         https://en.wikipedia.org/wiki/World's_funniest_joke   
1  https://en.wikipedia.org/wiki/The_Funniest_Joke_in_the_World   

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            parsed  
0  [html, [[n, <meta charset="utf-8"/>, n, <title>World's funniest joke - Wikipedia</title>, n, <script>document.documentElement.className="client-js";RLCONF={"wgBreakFrames":!1,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"X@pXWwpAIDEAAE2fgjIAAABR","wgCSPNonce":!1,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":0,"wgPageName":"World's_funniest_joke","wgTitle":"World's funniest joke","wgCurRevisionId":966811540,"wgRevisionId":966811540,"wgArticleId":647561,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["W...  
1  [html, [[n, <meta charset="utf-8"/>, n, <title>The Funniest Joke in the World - Wikipedia</title>, n, <script>document.documentElement.className="client-js";RLCONF={"wgBreakFrames":!1,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"X@pjbgpAICMAADkWE2kAAACQ","wgCSPNonce":!1,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":0,"wgPageName":"The_Funniest_Joke_in_the_World","wgTitle":"The Funniest Joke in the World","wgCurRevisionId":996508425,"wgRevisionId":996508425,"wgArticleId":19164,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups...  
 

но

 df.to_json('myjson.json')
df = pd.read_json('myjson.json')
df
Out[30]: 
                                                           link  parsed
0         https://en.wikipedia.org/wiki/World's_funniest_joke     NaN
1  https://en.wikipedia.org/wiki/The_Funniest_Joke_in_the_World     NaN
 

В чем здесь проблема? В качестве альтернативы, какой формат лучше всего подходит для хранения этого фрейма данных? csv как правило, ломается с таким количеством странных символов html…

Спасибо!

Комментарии:

1. может быть, потому, что html содержит двойные кавычки, обязательно ли это должно быть в pandas? Вы просто пытаетесь сохранить необработанный HTML?

Ответ №1:

Похоже, pandas не знает, как правильно обрабатывать экранирование символов в этом экземпляре в json. Если вам не нужно использовать pandas, вы можете сделать что-то вроде:

 import json
import requests


def write_json(data, path: str, indent: int = 4):
    with open(path, 'w') as file:
        json.dump(data, file, indent=indent)


def read_json(path: str):
    with open(path, 'r') as file:
        return json.load(file)


links = ['https://en.wikipedia.org/wiki/World's_funniest_joke',
         'https://en.wikipedia.org/wiki/The_Funniest_Joke_in_the_World']


html_data = {link: str(requests.get(link).content)
             for link in links}


write_json(html_data, './html_data.json')

print(json.dumps(read_json('./html_data.json'), indent=4))
 

Ответ №2:

преобразуйте bs4.BeautifulSoup тип в str тип.

 df['parsed'] = df['parsed'].map(str)
df.to_json('myjson.json')
df = pd.read_json('myjson.json')
 

Ответ №3:

Согласно вашему коду видно, что вы выполняете веб-очистку для этого, используя какую-либо третью сторону. в python используйте это

 json.dumps({
 

‘url’: str(urls),
‘uid’: str(UniqueID),
‘page_content’: htmlContent.text,
‘date’: finalDate
})