使用BeautifulSoup忽略列表中的某些元素

时间:2018-08-20 21:09:03

标签: python beautifulsoup

我正在尝试使用以下列表推导来检索BeautifulSoup对象的title属性。

[i.find(class_ = 'turnstileLink')['title'] for i in soup_obj.find_all(class_ = 'jobtitle')]

但是失败了,因为第一个元素没有标题对象。

[i for i in soup_obj.find_all(class_ = 'jobtitle')][0]

<a class="jobtitle" data-tn-element="jobTitle" href="/ita?id=21544&amp;tk=1clc5blpc5ihif01&amp;flowPage=jasxserp&amp;flowType=inline&amp;q=babysitter&amp;l=Austin%2C+TX&amp;adLoc=Austin%2C+TX&amp;fromita=1" rel="noopener" target="_blank">Nanny, Babysitter, Daycare Worker, Childcare Worker</a>

但是其余元素确实包含该属性。

[i for i in soup_obj.find_all(class_ = 'jobtitle')][1]

<h2 class="jobtitle" id="jl_916e5029c0a9d994">
<a class="turnstileLink" data-tn-element="jobTitle" href="/company/LA-Fitness/jobs/Babysitter-Kids-Klub-916e5029c0a9d994?fccid=0b9d9ba80ad80eea&amp;vjs=3" onclick="setRefineByCookie(['radius']); return rclk(this,jobmap[0],true,0);" onmousedown="return rclk(this,jobmap[0],0);" rel="noopener nofollow" target="_blank" title="Babysitter/Kids Klub"><b>Babysitter</b>/Kids Klub</a>
</h2>

因此,当我单独抓取一个不是元素0的元素时,这似乎起作用

仅供参考:这是创建了soup_obj的脚本

import requests
from bs4 import BeautifulSoup
from collections import Counter
import pandas as pd


url = 'https://www.indeed.com/jobs?q=babysitter&l=Austin,+TX&sort=date&limit=10&radius=25'
page = requests.get(url)
soup_obj = BeautifulSoup(page.text, 'html.parser')

很抱歉,如果其中的任何一个都难以消化,我仍然还是BeautifulSoup和python的相对新手。如有需要,可以提供更多详细信息

1 个答案:

答案 0 :(得分:0)

要避免在类似KeyErrors的对象中使用dict,可以使用get

[i.find(class_ = 'turnstileLink').get('title') for i in soup_obj.find_all(class_ = 'jobtitle') if i.find(class_ = 'turnstileLink').get('title')]

尽管那样会使阅读起来有些困难。您可能更喜欢使用:

gen = [i.find(class_ = 'turnstileLink').get('title') for i in soup_obj.find_all(class_ = 'jobtitle')]

links = [g for g in gen if g]

出于可读性考虑