Beautifulsoup webscraping - 从 <a> 标签中提取值

Posted

技术标签:

【中文标题】Beautifulsoup webscraping - 从 <a> 标签中提取值【英文标题】:Beautifulsoup webscraping - extract values from within <a> tags 【发布时间】:2021-12-22 15:08:01 【问题描述】:

我正在使用 bs4 来抓取 Indeed.com 的工作(链接 here)。我已经能够成功提取标题、公司和摘要,没有任何问题。

现在我想更进一步,提取用户点击每个职位时提供的子链接,例如这个link,所以我可以提取其他信息,例如每个角色所需的特定技术。

我注意到子链接 url 包含 jk=e5b27ae62cb7c45f,这是我可以用来创建子链接的 html 中包含的作业密钥。不幸的是,我正在努力提取此作业密钥!

我已经确定作业密钥嵌套在&lt;a&gt; 标记中,标记为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)

返回以下结果:

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,因为我不知道如何从&lt;a&gt; 标记中选择data-jk 值。我也很困惑为什么当我打电话给item.find('a') 时,带有class: 'tapItem'&lt;a&gt; 标签甚至没有出现?

我已经搜索了 ***,但找不到与我类似的问题。希望这里有人能帮我解决这个问题!

【问题讨论】:

title 没有直接的href 但所有报价都在&lt;a&gt; 内,我什至可以在您的图像上看到 - 在黑色背景的顶部。 你必须在 'job_seen_beacon 上方开始几个标签 - 在 id="mosaic-provider-jobcards" - 得到这个 &lt;a&gt; 感谢您的建议!我已经更新了我的问题以提供更多背景信息。我已经意识到我需要在上面开始一些标签,所以我正在使用 class: 'tapItem' 但仍然遇到提取 data-jk 的问题 data-jk 是类似hrefclass- id["data-jk"], id["href"], id["class"] 的属性 顺便说一句:属性是一个字典,所以你也可以像在普通字典中一样使用id.get("data-jk"), id.get("href")。你甚至可以使用默认值id.get("data-jk", default_value) 【参考方案1】:

title 没有直接的href,但所有报价都在&lt;a&gt; 内,我什至可以在您的图像上看到 - 在黑色背景的顶部(带有target="_blank"

你会得到job_seen_beacon,它也在这个&lt;a&gt;里面,所以你不能访问这个&lt;a&gt;。如果你在上面开始几个标签,那么你可以得到&lt;a&gt;和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)

【讨论】:

以上是关于Beautifulsoup webscraping - 从 <a> 标签中提取值的主要内容,如果未能解决你的问题,请参考以下文章

Beautifulsoup webscraping - 从 <a> 标签中提取值

Selenium Webdriver / Beautifulsoup + Web Scraping + 错误 416

Webscraping - 试图提取一些数据,但陷入了最后的障碍

使用 BeautifulSoup 进行网页抓取(Google)[重复]

Python - 网页抓取 - BeautifulSoup & CSV

Python的基本Web Scraping(Beautifulsoup和Requests)