Почему BeautifulSoup продолжает возвращать элементы с идентификатором класса, отличным от того, что я передаю? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь использовать BeautifulSoup для анализа iframe, содержащего новостную статью на корейском языке, и распечатывать каждый отдельный абзац основного текста в статье.Поскольку корейский контент абзаца находится в теге ap в его собственном теге td с идентификатором класса «tlTD», я решил, что могу просто пройтись по каждому td с этим именем класса и напечатать тег p следующим образом:

link ="https://gloss.dliflc.edu/GlossHtml/GlossHTML.html?disableBrowserLockout=true&gloss=true&glossLoXmlFileName=/GlossHtml/templates/linksLO/glossLOs/kp_cul312.xml&glossMediaPathRoot=https://gloss.dliflc.edu/products/gloss/"
base_url = "https://oda.dliflc.edu"

driver = webdriver.Chrome()
driver.get(link)
python_button = driver.find_element_by_id("gloss_link_source")
python_button.click() 

source_src= driver.find_element_by_id("glossIframe").get_attribute("src")
source_url = urljoin(base_url, source_src) 
driver.get(source_url)

soup = BeautifulSoup(driver.page_source, "lxml") 
for td in soup.find_all("td", class_="tlTD"):   
    print(soup.find("p").getText())

Проблема в том, что вместо печати абзацев основного текста код повторно печатает только заголовок статьи, который находится в своем собственном td с классом «title tlTD».Я попытался использовать лямбда-выражение и регулярное выражение, чтобы сделать имя класса более эксклюзивным, но я продолжал получать тот же результат.Изменение soup.find("p") на find_all успешно заставило код печатать то, что я хотел, но также напечатало кучу англоязычных версий контента, которые мне не нужны.

Я могу понять, почему содержимое заголовка статьи будет напечатано, поскольку оно включает в себя «tlTD» в названии класса, но я озадачен тем, откуда берется английский контент.Когда я проверил страницу в Google Chrome, на ней не было никаких абзацев с английским текстом, так почему же BeautifulSoup это удаляет?Может кто-нибудь помочь мне объяснить, что здесь происходит, и как я могу получить этот код, чтобы просто напечатать содержимое абзаца с корейским текстом?

1 Ответ

0 голосов
/ 27 июня 2019

tlTD класс td tag внутри iframe, вы можете легко получить доступ к данным iframe, например:

xpath для поиска iframe:

iframe = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//iframe[@id='glossIframe']")))

Затем переключитесь на iframe:

driver.switch_to.frame(iframe)

Вот как переключиться обратно на содержимое по умолчанию (из):

driver.switch_to.default_content()

явное ожидание более подробной информации

EX:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
link = "https://gloss.dliflc.edu/GlossHtml/GlossHTML.html?disableBrowserLockout=true&gloss=true&glossLoXmlFileName=/GlossHtml/templates/linksLO/glossLOs/kp_cul312.xml&glossMediaPathRoot=https://gloss.dliflc.edu/products/gloss/"

driver.get(link)

source_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "gloss_link_source")))
source_button.click()

#switch iframe
iframe = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//iframe[@id='glossIframe']")))
driver.switch_to.frame(iframe)

soup = BeautifulSoup(driver.page_source, "lxml")
#scrap iframe data
for td in soup.find_all("td", class_="tlTD"):
    print(td.find("p").getText())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...