1

我正在页面中搜索某些关键字并返回包含在 class 容器中的值ds_data。我的页面有多个关键字匹配,但我只想从标记为的某个容器返回匹配项<div id="tabsBody" class="tabsBody">

有没有办法告诉 Beautiful Soup 我只想从那里搜索,我试过了

ds_data = soup.find('div', {'class': 'tabsBody'}.findNext(text=pattern).findNext('div', {'class': 'ds_data'})

但这失败了

我的代码

keyword_list = [

'USB 2.0 ports quantity',
'USB 3.0 ports quantity',
'VGA',
'Internal memory'

]


#Iterate through our keyword list and return the results
for search_text in keyword_list:
    pattern = re.compile(r'\s*%s\s*' % search_text)
    ds_data = soup.find(text=pattern).findNext('div', {'class': 'ds_data'})
    if ds_data.find('img', {'class': 'spacer_top n-sign'}):
        result_text = '0'
    elif ds_data.find('img', {'class': 'spacer_top y-sign'}):
        result_text = 'Yes'
    else:
        result_text = ds_data.text
    print search_text, result_text
4

1 回答 1

3

您的代码(使用问题中的语法错误逐字复制

ds_data = soup.find('div', {'class': 'tabsBody'}
       .findNext(text=pattern)
       .findNext('div', {'class': 'ds_data'})

肯定会失败,因为它试图调用findNextpython 字典上的方法;一个dict()对象没有这样的方法。

但确实soup.find返回了一个您可以搜索的新汤,因此:

divsoup = soup.find('div', {'class': 'tabsBody'})
ds_data = divsoup.find(text=pattern).findNext('div', {'class': 'ds_data'})

将仅从<div class="tabsBody"></div>元素内返回匹配项。请注意,这findNext会将树导航到兄弟节点,因此 whilefind将仅导航到子节点。

此外,任何这些名称为单数(不包含全部)的方法都会返回None匹配项,因此如果您不确定内容,确实需要检查返回值。

于 2013-08-24T10:40:14.430 回答