Beautifulsoup 网络抓取 - 从 <a> 标签中提取值
Beautifulsoup webscraping - extract values from within <a> tags
我正在使用 bs4 来抓取 indeed.com 工作 (link here)。我已经能够成功提取标题、公司和摘要,没有任何问题。
现在我想更进一步,提取用户单击每个职位时提供的子link,例如这 link,因此我可以提取其他信息,例如每个角色所需的特定技术。
我注意到 sublink url 包含 jk=e5b27ae62cb7c45f
,这是 html 中包含的作业密钥,我可以使用它来创建 sublink。不幸的是,我正在努力提取这个工作密钥!
我已确定作业密钥嵌套在 <a>
标记中,标记为 data-jk
:
到目前为止,这是我使用 bs4 的函数:
def transform(soup):
divs = soup.find_all('a', class_= 'tapItem')
for item in divs:
title = item.find('h2', {'class':'jobTitle-color-purple'}).text
id = item.find('a')
print(title)
print(id)
transform(soup)
其中returns结果如下:
newDevOps Engineer
<a class="turnstileLink companyOverviewLink" data-tn-element="companyName" href="/cmp/Tata-Consultancy-Services-(tcs)" rel="noopener" target="_blank">Tata Consultancy Services (TCS)</a>
newDevOps Engineer - Sydney, Australia
None
DevOps Engineers
<a class="turnstileLink companyOverviewLink" data-tn-element="companyName" href="/cmp/CGI" rel="noopener" target="_blank">CGI</a>
Graduate Software Developer/Programmer (DevOps)
<a class="turnstileLink companyOverviewLink" data-tn-element="companyName" href="/cmp/Tata-Consultancy-Services-(tcs)" rel="noopener" target="_blank">Tata Consultancy Services (TCS)</a>
Cloud Engineer (Entry level, AWS training provided)
如您所见,我能够成功提取 title
但无法提取 id
,因为我不知道如何从内部提取 select data-jk
值<a>
标签。我也很困惑,为什么当我调用 item.find('a')
时,带有 class: 'tapItem'
的 <a>
标签甚至没有出现?
我搜索了 Whosebug,但找不到与我类似的问题。希望这里有人能帮我解决这个问题!
title
没有直接 href
但所有优惠都在 <a>
内,我什至可以在你的图片上看到 - 在黑色背景的顶部(target="_blank"
)
您得到 job_seen_beacon
,它也在 <a>
中,因此您无法访问此 <a>
。如果你在上面开始几个标签,那么你可以获得 <a>
和 href`
#divs = soup.find_all('div', class_ = 'job_seen_beacon')
divs = soup.find('div', {'id': 'mosaic-provider-jobcards'}).find_all('a', {'class': 'result'})
for item in divs:
link = item['href']
完整的工作示例
import requests
from bs4 import BeautifulSoup
#extract
def extract(url):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15'}
r = requests.get(url, headers)
soup = BeautifulSoup(r.content, 'html.parser')
return soup
#transform
def transform(soup):
#divs = soup.find_all('div', class_ = 'job_seen_beacon')
divs = soup.find('div', {'id': 'mosaic-provider-jobcards'}).find_all('a', {'class': 'result'})
joblist = []
for item in divs:
title = item.find('h2', {'class':'jobTitle-color-purple'}).text
company = item.find('span', {'class': 'companyName'}).text
summary = item.find('div', {'class': 'job-snippet'}).text.replace('\n','')
link = item['href']
print(link)
job = {
'title': title,
'company': company,
'summary': summary,
'link': link,
}
joblist.append(job)
#print(job)
print('---')
return joblist
soup = extract('https://uk.indeed.com/jobs?q=devops&start=0')
joblist = transform(soup)
#print(joblist)
我正在使用 bs4 来抓取 indeed.com 工作 (link here)。我已经能够成功提取标题、公司和摘要,没有任何问题。
现在我想更进一步,提取用户单击每个职位时提供的子link,例如这 link,因此我可以提取其他信息,例如每个角色所需的特定技术。
我注意到 sublink url 包含 jk=e5b27ae62cb7c45f
,这是 html 中包含的作业密钥,我可以使用它来创建 sublink。不幸的是,我正在努力提取这个工作密钥!
我已确定作业密钥嵌套在 <a>
标记中,标记为 data-jk
:
到目前为止,这是我使用 bs4 的函数:
def transform(soup):
divs = soup.find_all('a', class_= 'tapItem')
for item in divs:
title = item.find('h2', {'class':'jobTitle-color-purple'}).text
id = item.find('a')
print(title)
print(id)
transform(soup)
其中returns结果如下:
newDevOps Engineer
<a class="turnstileLink companyOverviewLink" data-tn-element="companyName" href="/cmp/Tata-Consultancy-Services-(tcs)" rel="noopener" target="_blank">Tata Consultancy Services (TCS)</a>
newDevOps Engineer - Sydney, Australia
None
DevOps Engineers
<a class="turnstileLink companyOverviewLink" data-tn-element="companyName" href="/cmp/CGI" rel="noopener" target="_blank">CGI</a>
Graduate Software Developer/Programmer (DevOps)
<a class="turnstileLink companyOverviewLink" data-tn-element="companyName" href="/cmp/Tata-Consultancy-Services-(tcs)" rel="noopener" target="_blank">Tata Consultancy Services (TCS)</a>
Cloud Engineer (Entry level, AWS training provided)
如您所见,我能够成功提取 title
但无法提取 id
,因为我不知道如何从内部提取 select data-jk
值<a>
标签。我也很困惑,为什么当我调用 item.find('a')
时,带有 class: 'tapItem'
的 <a>
标签甚至没有出现?
我搜索了 Whosebug,但找不到与我类似的问题。希望这里有人能帮我解决这个问题!
title
没有直接 href
但所有优惠都在 <a>
内,我什至可以在你的图片上看到 - 在黑色背景的顶部(target="_blank"
)
您得到 job_seen_beacon
,它也在 <a>
中,因此您无法访问此 <a>
。如果你在上面开始几个标签,那么你可以获得 <a>
和 href`
#divs = soup.find_all('div', class_ = 'job_seen_beacon')
divs = soup.find('div', {'id': 'mosaic-provider-jobcards'}).find_all('a', {'class': 'result'})
for item in divs:
link = item['href']
完整的工作示例
import requests
from bs4 import BeautifulSoup
#extract
def extract(url):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15'}
r = requests.get(url, headers)
soup = BeautifulSoup(r.content, 'html.parser')
return soup
#transform
def transform(soup):
#divs = soup.find_all('div', class_ = 'job_seen_beacon')
divs = soup.find('div', {'id': 'mosaic-provider-jobcards'}).find_all('a', {'class': 'result'})
joblist = []
for item in divs:
title = item.find('h2', {'class':'jobTitle-color-purple'}).text
company = item.find('span', {'class': 'companyName'}).text
summary = item.find('div', {'class': 'job-snippet'}).text.replace('\n','')
link = item['href']
print(link)
job = {
'title': title,
'company': company,
'summary': summary,
'link': link,
}
joblist.append(job)
#print(job)
print('---')
return joblist
soup = extract('https://uk.indeed.com/jobs?q=devops&start=0')
joblist = transform(soup)
#print(joblist)