在BeautifulSoup中将嵌套元素的文本用作选择器

2024-06-28 09:55:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找以下HTML结构:

<p><strong>ID:</strong>547</p>
<p><strong>Class:</strong>foobar</p>
<p><strong>Procedures:</strong>lorem ipsum.</p>
<p>dolor sit amet.</p>
...
<p><strong>Description:</strong>curabitur at orci posuere.</p>
<p>massa nec fringilla.</p>
...

我对使用BeautifulSoup不太有信心,也不太清楚如何处理给定节(id、class、procedures和description)的标识符嵌套在包含该节内容的第一段中这一事实。你知道吗

我正试着按照以下几点去做:

{
    'id': 547,
    'class': 'foobar',
    'procedures': 'lorem ipsum. dolor sit amet.'
    'description': 'curabitur at orci posuere. massa nec fringilla.'
}

Tags: idatstrongfoobarnecipsumloremdolor
1条回答
网友
1楼 · 发布于 2024-06-28 09:55:08

您可以使用element.next_sibling引用来获取<strong>标记后面的文本。对于没有strong标记的p标记,您必须附加到最后处理的键。你知道吗

使用Element.find_all()方法选择所有<p>标记,循环并更新字典:

mapping = {}
key = None
for item in soup.find_all('p'):
    if item.strong:
        key = item.strong.get_text(strip=True).rstrip(':')
        value = item.strong.next_sibling.strip()
    else:
        value = mapping[key] + ' ' + item.get_text(strip=True)
    mapping[key] = value

演示:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('''\
... <p><strong>ID:</strong>547</p>
... <p><strong>Class:</strong>foobar</p>
... <p><strong>Procedures:</strong>lorem ipsum.</p>
... <p>dolor sit amet.</p>
... ...
... <p><strong>Description:</strong>curabitur at orci posuere.</p>
... <p>massa nec fringilla.</p>
... ''')
>>> mapping = {}
>>> key = None
>>> for item in soup.find_all('p'):
...     if item.strong:
...         key = item.strong.get_text(strip=True).rstrip(':')
...         value = item.strong.next_sibling.strip()
...     else:
...         value = mapping[key] + ' ' + item.get_text(strip=True)
...     mapping[key] = value
... 
>>> from pprint import pprint
>>> pprint(mapping)
{u'Class': u'foobar',
 u'Description': u'curabitur at orci posuere. massa nec fringilla.',
 u'ID': u'547',
 u'Procedures': u'lorem ipsum. dolor sit amet.'}

这不会将ID转换为整数;如果您强烈希望转换表示整数的字符串,则可以使用try: value = int(value)except ValueError: pass组合。你知道吗

相关问题 更多 >