我正在寻找以下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,类,过程和描述)的标识符嵌套在包含该内容的第一段中的事实部分。
我正试图找到以下几点:
{
'id': 547,
'class': 'foobar',
'procedures': 'lorem ipsum. dolor sit amet.'
'description': 'curabitur at orci posuere. massa nec fringilla.'
}
答案 0 :(得分:2)
您可以使用element.next_sibling
引用获取 {/ 1>}标记后的文字。对于没有<strong>
标记的p
代码,您必须附加到最后处理的密钥。
使用strong
方法选择所有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
这不会将ID转换为整数;如果您对转换表示整数的字符串感到强烈,可以使用>>> 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.'}
,try: value = int(value)
组合。