Получение содержимого страницы из Confluence REST с помощью Python и Pandas - PullRequest
0 голосов
/ 22 мая 2019

Я хочу вычислить статистику слов на страницах в моей базе знаний, которая работает на Confluence.

Но прежде чем я сделаю вычисления, я хотел бы получить данные страницы: текст, написанный на страницах.

У меня есть скрипт Python, который был изначально создан для сбора комментариев со страниц.Я пытаюсь адаптировать скрипт для REST API / rest / api / content / {id}, который я нашел в браузере Confluence REST.

Оригинальный скрипт использует API, который возвращает результат в виде объекта JSON, который при разбореМетод json () возвращает объекты словаря.

Однако API / rest / api / content / {id} возвращает результат, который не содержит правильно сформированный словарь.Я получаю строковые объекты и не могу просто обратиться к ним как к массиву ['index'] = result ['value'] для получения данных страницы.

Я использую среду JupyterLab для запуска кода.

При использовании Confluecne Browser и / rest / api / content / {id} API для страницы 4068365 Confluence возвращает следующий результат:

{
  "id": "4068365",
  "type": "page",
  "status": "current",
  "title": "Page title",
  "body": {
    "view": {
      "value": "<p>Some text</p>",
      "representation": "storage",
      "_expandable": {
        "webresource": "",
        "content": "/rest/api/content/4068365"
      }
    },
    "_expandable": {
      "editor": "",
      "export_view": "",
      "styled_view": "",
      "storage": "",
      "anonymous_export_view": ""
    }
  },
  "extensions": {
    "position": "none"
  },

...

Я хотел бы получить значение 'value'ключ.Однако параметр 'value' не распознается как ключ, потому что результат отформатирован как строка, а не как словарь.

Вот код, который у меня есть.


import requests
import json
import getpass
import re
import html
import pandas as pd
from datetime import datetime

# Allow HTTPS connections with self-signed cert
requests.packages.urllib3.disable_warnings()

# Create login session for Confluence
auth = ('mylogin', getpass.getpass())
s = requests.Session()
s.auth = auth
s.verify = False
s.headers = {"Content-Type": "application/json"}

# Confluence REST API URI
WIKI = 'https://example.net/wiki/rest/api/'

# Obtain text from Confluence HTML layout
def cleanhtml(raw_html):
    cleanr = re.compile('<.*?>')
    text = html.unescape(raw_html)
    text = re.sub(cleanr, '', text)
    text = text.replace(u'\xa0', u' ')
    return text

# Retrieving page data
def get_data(page_id):
    data = []
    r = s.get(
     '{}content/{}'.format(WIKI, page_id),
      params = dict(
       expand='body.view'
       )      
    )
    for content in r.json():
        pgdata = dict()
#I can't address to value as content['value']
        pgdata['text'] = cleanhtml(content['body']['view'].get('value'))
        data.append(pgdata)            
   return data

# Pages to extract from
with open(r'C:\\Users\\Stacy\\Documents\\pages.txt') as pagesf:
     pagesl = pagesf.read()
pages = pagesl.split(",\n")        
print(pages)

# Preparing data frame and exporting to Excel
textdata = list()
for page in pages:
    print('Handing:', page)
    textdata.extend(get_data(page))

df = pd.DataFrame(
    textdata, 
    columns = ['text']
)

df.to_excel('page_data{}.xlsx'.format(datetime.now().strftime("%Y_%m_%d_%H-%M")))

Я хочусобрать текст из

 "value": "<p>Some text</p>",

в данные и сохранить все это в словаре.Тем не менее, я вижу, что контент содержит тип данных, а не данные, поэтому я не могу ссылаться на «тело» как на ключ, потому что это не ключ.

Пожалуйста, помогите мне извлечь данные страницы из «значения»,Какой будет правильный путь?Спасибо.

1 Ответ

0 голосов
/ 24 мая 2019

Вот решение, к которому я пришел:


def get_words(page_id):
    comments = []
    r = s.get(
      '{}content/{}'.format(WIKI, page_id),
        params = dict(
           expand='body.view'
           )      
        )
    for cmnt in r: # No valid json, so we scan the result
        comments.append(cmnt) # Collect all strings into a list
        bytes = [] #Results are encoded, store decoded data in a list
        for byte in comments:
            byted = byte.decode('utf-8', 'ignore') #Decode as UTF-8 and ignore errors
            bytes.append(byted)
    bytesstr = "".join(bytes) # List contains split strings, join them together into a single line
    parsed = json.loads(bytesstr); # Convert the line into a valid JSON object
    pgdata =  dict() # Preparing dictionary to store extracted text
    pgdata['value'] = parsed['body']['view'].get('value') # Retrieving text from the page
    pgdatac = cleanhtml(pgdata['value']) # Removing HTML tags
    counts = len(re.findall(r'\w+', pgdatac)) # Extra line to calculate words on a page
    print(counts)
...