[使用BeautifulSoup在融合HTML中查找文本标签

问题描述 投票:0回答:1

我正在尝试使用Beautiful Soup刮擦Confluence页面的正文。使用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>

所以我的想法是搜索带有文本'System Status:']的段落>

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

[如果我有该段落,则可以搜索带有属性'ac:name'的标记'ac.parameter',从而获得系统状态。paragraph.find('ac:parameter', {'ac:name': 'title'}).text

第二部分有效-我通过遍历所有段落来进行尝试。不幸的是,第一部分不起作用。当我使用给出代码时,得到的结果为空。

我已经搜索了我的屁股,但是不知为何我不明白如何搜索带有特定文本的段落。

我认识但不理解的另一件事:当我使用以下命令搜索所有段落时:paragraphs = soup.find_all('p')我找到了该段落,但其中包含所有子元素的所有文本,因此paragraph.text如下所示:'系统状态:GreenIN OPERATION'

我正在尝试使用Beautiful Soup刮擦Confluence页面的正文。使用Confluence API时,我得到以下内容(这只是其中一部分):[

python-3.x web-scraping beautifulsoup confluence
1个回答
0
投票

使用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"]')])
© www.soinside.com 2019 - 2024. All rights reserved.