테이블 형식 데이터 (iframe)가 포함 된 웹 사이트에서 요소를 구문 분석 할 수 없습니다.

Dec 21 2020

우리는 직업 웹 사이트href 의 DOM에서 속성 을 파싱하려고합니다 . 우리는 각 직업에 대해 얻고 싶습니다 .href

우리는 일반적으로 CSS 경로를 사용하고이를 Selenium의 find_elements_by_css메서드에 전달합니다 .

안타깝게도 브라우저 플러그인 SelectorGadget 이 CSS 경로를 제공하는 데 문제 가 있음을 발견했습니다 . Google Chrome (ctrl + shift + c)을 사용하여 CSS 경로를 계속 사용했습니다. Chrome은 경로를 추출 할 수 있지만 Selenium이나 BeautifulSoup 모두 이러한 경로를 사용할 수 없습니다 .

다른 클래스와 태그를 사용하여 요소를 추출하려는 시도가 여러 번 실패한 후, 우리의 접근 방식이나 웹 사이트에 완전히 잘못된 것이 있다고 생각합니다. 어떤 이유로 든 원하는 요소를 Selenium과 BeautifulSoup에서 구문 분석 할 수 없다고 가정합니다. iframeDOM 의 태그가 오류의 원인이 될 수 있습니까 (이 SO 질문 참조 )? 여기서 구문 분석이 실패하는 이유는 무엇이며이 문제를 해결할 수있는 방법이 있습니까? 웹 사이트 관련 문제 소스는 선택기 가젯이 애초에 경로를 가져올 수없는 이유도 설명합니다. 결론은 정규식을 사용하여 href필요한 속성 을 추출하는 것입니다. 이것은 마지막 수단 일뿐입니다.

독일어 사용자의 경우 대상 요소에 철자 오류가 <div class="stellenagebot">있습니다.. (우리가했던 것처럼) 그들과 혼동하지 마십시오.

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&auml;rkung unseres Teams suchen wir:</h3>\n\n<p class="hyphenate" lang="de">&nbsp;</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

따라서 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: []

답변

3 KunduK Dec 21 2020 at 23:25

검색중인 요소는 내부에 comments있습니다. 값을 얻으려면 먼저이 태그 정보를 가지고 문자열로 변환 한 다음 다시 구문 분석해야합니다.

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'])

산출:

/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/