#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
})