Web Scraping: нужна помощь, чтобы вернуть весь абзац текста, когда ключевое слово найдено - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь создать скрипт Web Scraping, который позволит мне очищать данные сайта на основе ключевых слов.Поэтому, если ключевое слово встречается на Веб-сайте, оно должно вернуть весь абзац (или лучше весь список вакансий с описаниями).Однако мой кодовый атм возвращает только фактическое ключевое слово, которое я искал, а не весь абзац, в котором находится ключевое слово. Вот мой код:

import requests

from bs4 import BeautifulSoup as Bsoup


keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
        "Machine Learning", "Baumeisterarbeiten"]

headers = {''}


url = "https://www.auftrag.at//tenders.aspx"


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


soup = Bsoup(data.text, 'html.parser')


# jobs = soup.find_all('div', {'class': 'article'})


jobs = soup.find_all(string=["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
        "Machine Learning"])

print(jobs)


for word in jobs:
   print(word)

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Вы можете изменить find_all для соответствия текста с регулярным выражением:

jobs = soup.find_all('p',text=re.compile(r'|'.join(keywords)))

Таким образом, полный код будет:

import requests
import re
from bs4 import BeautifulSoup as Bsoup


keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
        "Machine Learning", "Baumeisterarbeiten"]

url = "https://www.auftrag.at//tenders.aspx"
data = requests.get(url, timeout=5)


soup = Bsoup(data.text, 'html.parser')


# jobs = soup.find_all('div', {'class': 'article'})

jobs = soup.find_all('p',text=re.compile(r'|'.join(keywords)))

print(len(jobs))

for word in jobs:
   print(word)

Мой вывод здесь дает мне136 результатов

РЕДАКТИРОВАТЬ:

Я бы добавил границы слов, чтобы избежать пропущенного соответствия, как KILL для KI

Так что янаписал бы это регулярное выражение:

jobs = soup.find_all('p',text=re.compile(r'\b(?:%s)\b' % '|'.join(keywords)))
0 голосов
/ 07 марта 2019

Поскольку представляется, что использование регулярных выражений для html не является хорошей идеей , вот альтернатива без регулярных выражений:

import requests
from bs4 import BeautifulSoup as bs4


keywords = ["KI", "AI", "Big Data", "Data", "data", "big data", "Analytics", "analytics", "digitalisierung", "ML",
    "Machine Learning", "Baumeisterarbeiten"]

url = "https://www.auftrag.at//tenders.aspx"
data = requests.get(url, timeout=5)


soup = bs4(data.text, 'html.parser')
jobs = soup.find_all('p')

for keyword in keywords:    
   for job in jobs:
       if keyword in str(job):
           print(job)            

Вывод - 138 результатов по сравнению с 136в ответе @ Maaz (не уверен, почему расхождение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...