Разобрать ссылку буфера обмена Lotus Notes с помощью lxml

Я пытаюсь разобрать ссылку на документ Lotus Notes (взятую из буфера обмена), чтобы преобразовать ее в notes:// URL/URI. Из параметров буфера обмена видно, что получение данных из текстового формата является более простым способом преобразования. Однако ссылка выглядит как действительно плохо сформированный XML, а lxml теряет информацию при синтаксическом анализе.

data = """Name - Enc: Injeção
<NDL>
<REPLICA 83257B7B:00608A81>
<VIEW OFDCBCE5C7:007D345D-ON882572F4:00650240>
<NOTE OFD18FCA06:36A9EDA2-ON83257F6A:004E31C1>
<HINT>CN=SERV101/OU=RJ/OU=C/O=Company</HINT>
<REM>Database 'Name', View 'Inbox', Document 'Enc: Injeção'</REM>
</NDL>
"""
from lxml import html, etree
title, ndl = html.fragments_fromstring(data)
replica = ndl[0]
view = replica[0]
print replica.attrib
print view.attrib
print html.tostring(ndl)

Это печатает:

{}
{'ofdcbce5c7:007d345d-on882572f4:00650240': ''}
<ndl>
<replica>
<view ofdcbce5c7:007d345d-on882572f4:00650240>
<note ofd18fca06:36a9eda2-on83257f6a:004e31c1>
<hint>CN=SERV101/OU=RJ/OU=C/O=Company</hint>
<rem>Database 'Name', View 'Inbox', Document 'Enc: Inje&#195;&#167;&#195;&#163;o'</rem>
</note></view></replica></ndl>

Итак, я теряю информацию из тега REPLICA, хотя я все еще получаю некоторую информацию из тега VIEW (я подозреваю, что дефис может иметь значение здесь).

Итак, есть ли способ получить все данные с помощью lxml или мне нужно вернуться к RegExp?

Информация об окружающей среде:

  • Windows 7, 64-разрядная версия
  • Python 2.7.11 | Анаконда 2.4.1 (32-разрядная версия)
  • LXML 3.4.4

person Ronan Paixão    schedule 07.04.2016    source источник
comment
Какую версию Lotus Notes вы используете? У меня сложилось впечатление, что последние версии должны были помещать URL-адрес notes:// в буфер обмена как один из альтернативных форматов. (Если подумать, это может быть только для операций перетаскивания. Как вы помещаете данные в буфер обмена.)   -  person Richard Schwartz    schedule 08.04.2016
comment
Lotus Notes 8.5.3. Я копирую ссылку, щелкнув документ правой кнопкой мыши и выбрав «Копировать как ссылку на документ».   -  person Ronan Paixão    schedule 11.04.2016


Ответы (1)


Вы можете найти bs4 лучше:

data = """Name - Enc: Injeção
<NDL>
<REPLICA 83257B7B:00608A81>
<VIEW OFDCBCE5C7:007D345D-ON882572F4:00650240>
<NOTE OFD18FCA06:36A9EDA2-ON83257F6A:004E31C1>
<HINT>CN=SERV101/OU=RJ/OU=C/O=Company</HINT>
<REM>Database 'Name', View 'Inbox', Document 'Enc: Injeção'</REM>
</NDL>
"""
from lxml.etree import fromstring, HTMLParser
xml = fromstring(data, HTMLParser())
r = xml.xpath("//replica")


from bs4 import BeautifulSoup

soup = BeautifulSoup(data,"html.parser")

title = next(soup.find("ndl").previous_elements)
print(title)
print(soup.find("replica").attrs)
print(soup.find("view"))

Что дает вам:

Name - Enc: Injeção

{u'83257b7b:00608a81': ''}
view ofdcbce5c7:007d345d-on882572f4:00650240="">
<note ofd18fca06:36a9eda2-on83257f6a:004e31c1="">
<hint>CN=SERV101/OU=RJ/OU=C/O=Company</hint>
<rem>Database 'Name', View 'Inbox', Document 'Enc: Injeção'</rem>
</note></view>
person Padraic Cunningham    schedule 09.04.2016