使用 BeautifulSoup 在 confluence HTML 中查找文本标签
Find tag for text in confluence HTML using BeautifulSoup
我正在尝试使用 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>
我想要实现的是获取系统状态,可以在段落 'System Status:' 和
中找到
<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 看起来像这样:
'System Status: GreenIN OPERATION'
使用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)
我正在尝试使用 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>
我想要实现的是获取系统状态,可以在段落 'System Status:' 和
中找到<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 看起来像这样:
'System Status: GreenIN OPERATION'
使用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)