Найти тег для текста в слиянии HTML с помощью BeautifulSoup - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь очистить тело страницы слияния с помощью Beautiful Soup. При использовании Confluence API я получаю следующее тело (это только его часть):

<ac:layout>
    <ac:layout-section ac:type=\"two_equal\">
        <ac:layout-cell>
            <p class=\"auto-cursor-target\"><br /></p>
            <ac:structured-macro ac:name=\"info\" ac:schema-version=\"1\"
                ac:macro-id=\"3fbdeddd-563d-4584-b665-a2116defc645\">
                <ac:rich-text-body>
                    <p>System Status: <ac:structured-macro ac:name=\"status\" ac:schema-version=\"1\"
                            ac:macro-id=\"1cb65333-dc9a-45f0-948b-fb1d1f5403e8\">
                            <ac:parameter ac:name=\"colour\">Green</ac:parameter>
                            <ac:parameter ac:name=\"title\">IN OPERATION</ac:parameter>
                            <ac:parameter ac:name=\"\" />
                        </ac:structured-macro>
                    </p>
                </ac:rich-text-body>
            </ac:structured-macro>
            <p class=\"auto-cursor-target\"><br /></p>
        </ac:layout-cell>
        <ac:layout-cell>
            <p class=\"auto-cursor-target\"><br /></p>
            <ac:structured-macro ac:name=\"info\" ac:schema-version=\"1\"
                ac:macro-id=\"b7d32741-c5c2-4d84-b7f3-fb3f391080ab\">
                <ac:rich-text-body>
                    <p>Page Status: <ac:structured-macro ac:name=\"status\" ac:schema-version=\"1\"
                            ac:macro-id=\"c947d571-9ac5-4199-a527-57fd0c8e6170\">
                            <ac:parameter ac:name=\"colour\">Green</ac:parameter>
                            <ac:parameter ac:name=\"title\">IN OPERATION</ac:parameter>
                            <ac:parameter ac:name=\"\" />
                        </ac:structured-macro>
                    </p>
                </ac:rich-text-body>
            </ac:structured-macro>
            <p class=\"auto-cursor-target\"><br /></p>
        </ac:layout-cell>
    </ac:layout-section>

Я пытаюсь добиться состояния системы, которое можно найти в абзаце ' Состояние системы: 'и там в

<ac:parameter ac:name=\"title\">IN OPERATION</ac:parameter>

Поэтому моя идея состояла в том, чтобы искать абзац с текстом «Состояние системы:»

paragraph = soup.find('p', text=re.compile('.*System Status.*'))

Если я Получив абзац, я могу найти тег «a c .parameter» с атрибутом «a c: name» и, таким образом, получить состояние системы. paragraph.find('ac:parameter', {'ac:name': 'title'}).text

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

Я уже отыскал свою задницу, но почему-то кажется, что я не понимаю, как искать абзац с определенным текстом.

Еще одна вещь, которую я узнал и не понял: когда я ищу все абзацы, используя: paragraphs = soup.find_all('p'), я нахожу абзац, но в нем есть весь текст всех подэлементов, так что абзац.текст выглядит так: «Состояние системы: GreenIN ЭКСПЛУАТАЦИЯ»

1 Ответ

0 голосов
/ 12 апреля 2020

Используйте xml парсер и введите parameter[name="title"]

from bs4 import BeautifulSoup as bs 

xml = '''<ac:layout>
    <ac:layout-section ac:type=\"two_equal\">
        <ac:layout-cell>
            <p class=\"auto-cursor-target\"><br /></p>
            <ac:structured-macro ac:name=\"info\" ac:schema-version=\"1\"
                ac:macro-id=\"3fbdeddd-563d-4584-b665-a2116defc645\">
                <ac:rich-text-body>
                    <p>System Status: <ac:structured-macro ac:name=\"status\" ac:schema-version=\"1\"
                            ac:macro-id=\"1cb65333-dc9a-45f0-948b-fb1d1f5403e8\">
                            <ac:parameter ac:name=\"colour\">Green</ac:parameter>
                            <ac:parameter ac:name=\"title\">IN OPERATION</ac:parameter>
                            <ac:parameter ac:name=\"\" />
                        </ac:structured-macro>
                    </p>
                </ac:rich-text-body>
            </ac:structured-macro>
            <p class=\"auto-cursor-target\"><br /></p>
        </ac:layout-cell>
        <ac:layout-cell>
            <p class=\"auto-cursor-target\"><br /></p>
            <ac:structured-macro ac:name=\"info\" ac:schema-version=\"1\"
                ac:macro-id=\"b7d32741-c5c2-4d84-b7f3-fb3f391080ab\">
                <ac:rich-text-body>
                    <p>Page Status: <ac:structured-macro ac:name=\"status\" ac:schema-version=\"1\"
                            ac:macro-id=\"c947d571-9ac5-4199-a527-57fd0c8e6170\">
                            <ac:parameter ac:name=\"colour\">Green</ac:parameter>
                            <ac:parameter ac:name=\"title\">IN OPERATION</ac:parameter>
                            <ac:parameter ac:name=\"\" />
                        </ac:structured-macro>
                    </p>
                </ac:rich-text-body>
            </ac:structured-macro>
            <p class=\"auto-cursor-target\"><br /></p>
        </ac:layout-cell>
    </ac:layout-section>
</ac:layout>'''

soup = bs(xml, 'xml')
print([i.text for i in soup.select('parameter[name="title"]')])

Только один для состояния системы

print(soup.select_one('p:contains("System Status:") parameter[name="title"]').text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...