使用嵌套元素的文本作为BeautifulSoup中的选择器

时间:2014-12-16 22:12:27

标签: python beautifulsoup scrape

我正在寻找以下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.'
}

1 个答案:

答案 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)组合。