Соскоб в Интернете. Как извлечь из html ссылки, соответствующие ключевым словам, которые сопоставляются с другими тегами без ключевого слова в URL? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь извлечь описания работы с веб-страницы, если она соответствует определенным ключевым словам, и это работает, однако я также хочу извлечь ссылку, которая соответствует описанию, найденному в HTML.Проблема заключается в том, что ссылка появляется перед описанными ключевыми словами, а URL не содержит ключевое слово для поиска.Как я могу извлечь ссылки, которые соответствуют описанию работы, которое было найдено по ключевым словам?

Вот мой код:

import re, requests, time, os, csv, subprocess

from bs4 import BeautifulSoup


def get_jobs(url):

keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
            "Machine Learning", "Daten", "Datenexperte", "Datensicherheitsexperte"]
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}

html = requests.get(url, headers=headers, timeout=5)

time.sleep(2)

soup = BeautifulSoup(html.text, 'html.parser')

jobs = soup.find_all('p',text=re.compile(r'\b(?:%s)\b' % '|'.join(keywords)))

# links = jobs.find_all('a')


jobs_found = []
for word in jobs:
    jobs_found.append(word)
with open("jobs.csv", 'a', encoding='utf-8') as toWrite:
    writer = csv.writer(toWrite)
    writer.writerows(jobs_found)
    # subprocess.call('./Autopilot3.py')
    print("Matched Jobs have been collected.")


get_jobs('https://www.auftrag.at//tenders.aspx')

1 Ответ

0 голосов
/ 27 марта 2019

Просматривая в Интернете, я увидел, что ссылка всегда на два уровня выше описания.Затем вы используете функцию find_parent() для получения тега a найденных вакансий.

У вас есть код:

jobs = soup.find_all('p',text=re.compile(r'\b(?:%s)\b' % '|'.join(keywords)))

Затем после этого добавьте:

for i in jobs:
   print(i.find_parent('a').get('href'))

Это распечатает ссылки. Обратите внимание, что эти ссылки являются относительными, а не абсолютными .Вы должны добавить рут, чтобы найти конкретную страницу.Например, если вы обнаружите, что одна ссылка: ETender.aspx?id=ed60009c-8d64-4759-a722-872e21cf9ea7&action=show.Вы должны добавить в начало: https://www.auftrag.at/.Будучи последней ссылкой: https://www.auftrag.at/ETender.aspx?id=ed60009c-8d64-4759-a722-872e21cf9ea7&action=show

Если вы хотите, вы можете добавить их в список, как вы делаете с описаниями рабочих мест.Полный код (без сохранения в csv) будет выглядеть так:

import re, requests, time, os, csv, subprocess

from bs4 import BeautifulSoup


def get_jobs(url):

    keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
                "Machine Learning", "Daten", "Datenexperte", "Datensicherheitsexperte"]
    headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'}

    html = requests.get(url, headers=headers, timeout=5)

    time.sleep(2)

    soup = BeautifulSoup(html.text, 'html.parser')

    jobs = soup.find_all('p',text=re.compile(r'\b(?:%s)\b' % '|'.join(keywords)))

    # links = jobs.find_all('a')


    jobs_found = []
    links = []
    for word in jobs:
        jobs_found.append(word)
        links.append(word.find_parent('a').get('href'))
    with open("jobs.csv", 'a', encoding='utf-8') as toWrite:
        writer = csv.writer(toWrite)
        writer.writerows(jobs_found)
        # subprocess.call('./Autopilot3.py')
        print("Matched Jobs have been collected.")

    return soup, jobs
soup, jobs = get_jobs('https://www.auftrag.at//tenders.aspx')

Если вы хотите добавить полный URL, просто измените строку:

links.append(word.find_parent('a').get('href'))

На:

links.append("//".join(["//".join(url.split("//")[:2]),word.find_parent('a').get('href')]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...