BeautifulSoup:如何跳过find_all中的子节点?

时间:2015-10-25 15:09:03

标签: python beautifulsoup

我有以下代码来抓取这个页面:

soup = BeautifulSoup(html)
result = u''
# Find Starting point
start = soup.find('div', class_='main-content-column')
if start:
    news.image_url_list = []
    for item in start.find_all('p'):

我面临的问题是它还抓住<p>内部<div class="type-gallery">,我想避免这种情况。但找不到实现它的方法。 有什么想法吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

你想要直接孩子,而不仅仅是element.find_all()返回的任何后代。这里最好的选择是使用CSS selector代替:

for item in soup.select('div.main-content-column > div > p'):

>运算符将此限制为p个标记,这些标记是具有给定类的divdiv个标记的直接子节点。你可以根据自己的喜好制作这个;添加itemprop属性,例如:

for item in soup.select('div.main-content-column > div[itemprop="articleBody"] > p'):

另一种方法是循环遍历element.children iterable

start = soup.find('div', class_='main-content-column')
if start:
    news.image_url_list = []
    for item in start.children:
        if item.name != 'div':
            # skip children that are not <div> tags
            continue
        for para in item.children:
            if item.name != 'p':
                # skip children that are not <p> tags
                continue