Tidak dapat mengurai elemen dari situs web yang berisi data tabel (iframe)
Kami mencoba mengurai href
atribut dari DOM situs web pekerjaan . Kami ingin mendapatkan href
untuk setiap pekerjaan.
Kami biasanya menggunakan jalur CSS dan meneruskannya ke find_elements_by_cssmetode Selenium .
Sayangnya, kami memperhatikan bahwa plugin browser SelectorGadget mengalami masalah dalam menyediakan jalur CSS. Kami melanjutkan untuk menggunakan jalur CSS menggunakan Google Chrome (ctrl + shift + c). Chrome dapat mengekstrak jalur, tetapi Selenium maupun BeautifulSoup tidak dapat bekerja dengan jalur tersebut.
Setelah banyak upaya yang gagal untuk mengekstrak elemen menggunakan kelas dan tag yang berbeda, kami yakin ada sesuatu yang salah dengan pendekatan kami atau situs web. Kami berhipotesis bahwa elemen yang diinginkan tidak mungkin diurai oleh Selenium dan BeautifulSoup karena alasan apa pun? Mungkinkah iframe
tag di DOM menjadi sumber kesalahan (lihat pertanyaan SO ini )? Apa yang membuat penguraian gagal di sini, dan adakah cara untuk mengatasi masalah ini? Sumber masalah terkait situs web juga akan menjelaskan mengapa Gadget Pemilih tidak bisa mendapatkan jalur sejak awal. Kesimpulan kami adalah menggunakan ekspresi reguler untuk mengekstrak href
atribut yang kami butuhkan. Ini hanya akan menjadi solusi terakhir.
Untuk Jerman-speaker, silakan catatan thatthere adalah kesalahan ejaan dalam elemen sasaran: <div class="stellenagebot">
. Tolong jangan biarkan diri Anda bingung dengan mereka (seperti yang kami lakukan).
Tidak beruntung dengan BeautifulSoup:
import re
import requests
from bs4 import BeautifulSoup
url = 'https://www.artemiskliniken.de/Karriere/%C3%84rzte/'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
print(soup.prettify())
# Out: ...
#<div class="col-md-4 wow fadeInUp">
# <div class="stellenagebot">
# <h3>
# Facharzt (m/w/d) für Augenheilkunde in Voll- oder Teilzeit
# </h3>
# <h4>
# Erfurt
# </h4>
# <a class="btn btn-default" href="/Stellenangebot/Facharzt_Augenheilkunde_Erfurt/">
# Mehr
# </a>
# </div>
#</div>
#<div class="col-md-4 wow fadeInUp">
# <div class="stellenagebot">
# <h3>
# Facharzt (m/w/d) für Augenheilkunde in Voll- oder Teilzeit
# </h3>
# <h4>
# Eschwege
# </h4>
# <a class="btn btn-default" href="/Stellenangebot/Facharzt_Augenheilkunde_Eschwege/">
# Mehr
# </a>
# </div>
#</div>
# ...
print(soup.find_all('.stellenagebot'))
# Out: []
print(soup.find_all(string=re.compile("Stellenangebot")))
# ['Stellenangebote Facharzt für Augenheilkunde und Karrierewege für Ärzte', '<h3>Zur Verstärkung unseres Teams suchen wir:</h3>\n\n<p class="hyphenate" lang="de"> </p>\n\n<div id=\'jobauflistung\' class=\'row\'><div class=\'col-md-4 wow fadeInUp\'><div class="stellenagebot">\n<h3>Facharzt (m/w/d) für Augenheilkunde in Voll- oder Teilzeit</h3>\n\n<h4>Aachen</h4>\n<a class="btn btn-default" href="/Stellenangebot/Facharzt_Augenheilkunde_Aachen/">Mehr</a></div></div><div class=\'col-md-4 wow fadeInUp\'><div class="stellenagebot">\n<h3>Facharzt (m/w/d) fü
# ...
# ></div>\n</div>\n</div>\n</div>\n</footer>\n</div><!-- AUF ALLEN SEITEN IN DEN BODY-TAG EINFÜGEN ']
print(len(soup.find_all(string=re.compile("Stellenangebot"))))
# Out: 2
Jadi tidak beruntung dengan Selenium:
from selenium import webdriver
from job_scraper.configuration import CHROMEDRIVER_VERSION, ROOT_PATH, \
CHROME_OPTIONS
driver = webdriver.Chrome(
ROOT_PATH / f'assets/chrome_drivers/{CHROMEDRIVER_VERSION}',
options=CHROME_OPTIONS
)
driver.maximize_window()
driver.get(url)
driver.find_elements_by_css_selector('.stellenagebot')
# Out: []
Jawaban
Elemen yang Anda cari ada di dalam comments
. Anda harus memiliki informasi tag ini terlebih dahulu, lalu mengubahnya menjadi string, lalu mengurai lagi untuk mendapatkan nilainya.
from bs4 import Comment
import requests
url = 'https://www.artemiskliniken.de/Karriere/%C3%84rzte/'
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
#Capture Comments element
comments = soup.find_all(text=lambda text:isinstance(text, Comment))
Newsoup = BeautifulSoup(''.join(comments), 'html.parser')
for item in Newsoup.select('[href*="Stellenangebot"]'):
print(item['href'])
Keluaran:
/Stellenangebot/Facharzt_Augenheilkunde_Aachen/
/Stellenangebot/Facharzt_Augenheilkunde_Bad_Berleburg/
/Stellenangebot/Facharzt_Augenheilkunde_Bad_Hersfeld/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Beckum/
/Stellenangebot/Facharzt_Augenheilkunde_Beckum/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Dieburg/
/Stellenangebot/Facharzt_Augenheilkunde_Dieburg /
/Stellenangebot/Facharzt_Augenheilkunde_Dillenburg/
/Stellenangebot/Facharzt_Augenheilkunde_Duisburg/
/Stellenangebot/Facharzt_Augenheilkunde_Erfurt/
/Stellenangebot/Facharzt_Augenheilkunde_Eschwege/
/Stellenangebot/Facharzt_Augenheilkunde_Frankfurt/
/Stellenangebot/Facharzt_Augenheilkunde_Helmstedt/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Heppenheim/
/Stellenangebot/Facharzt_Augenheilkunde_Herborn/
/Stellenangebot/Facharzt_Augenheilkunde_Hoyerswerda/
/Stellenangebot/Facharzt_Augenheilkunde_Koeln/
/Stellenangebot/Facharzt_Anaesthesie/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Leverkusen/
/Stellenangebot/Facharzt_Augenheilkunde_Limburg/
/Stellenangebot/Facharzt_Augenheilkunde_Mainz/
/Stellenangebot/Facharzt_Augenheilkunde_Marburg/
/Stellenangebot/Facharzt_Augenheilkunde_Melsungen/
/Stellenangebot/Facharzt_Augenheilkunde_Moers/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Moers/
/Stellenangebot/Facharzt_Augenheilkunde_Moerfelden/
/Stellenangebot/Facharzt_Augenheilkunde_Muehlhausen/
/Stellenangebot/Facharzt_Augenheilkunde_Isenburg/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Oberhausen/
/Stellenangebot/Facharzt_Augenheilkunde_Oberhausen/
/Stellenangebot/Facharzt_Augenheilkunde_Obertshausen/
/Stellenangebot/Facharzt_Augenheilkunde_Oberursel/
/Stellenangebot/Facharzt_Augenheilkunde_Offenbach/
/Stellenangebot/Weiterbildungsarzt_Augenheilkunde_Offenbach/
/Stellenangebot/Facharzt_Augenheilkunde_Ruesselsheim/
/Stellenangebot/Facharzt_Augenheilkunde_Salzkotten/
/Stellenangebot/Facharzt_Augenheilkunde_Wetzlar/
/Stellenangebot/Facharzt_Augenheilkunde_Wiesbaden/