Навигация по html-дереву с помощью BeautifulSoup и / или Selenium - PullRequest
0 голосов
/ 11 сентября 2018

Я только начал использовать BeautifulSoup и столкнулся с препятствием в самом начале.Я просмотрел похожие посты, но не нашел решения своей конкретной проблемы, или есть что-то фундаментальное, чего я не понимаю.Моя цель - извлечь японские слова с их английскими переводами и примерами с этой страницы.

https://iknow.jp/courses/566921

и сохранить их в dataFrame или csv файле.

IЯ могу видеть анализируемый вывод и содержимое некоторых тегов, но всякий раз, когда я пытаюсь запросить что-то с интересующим меня классом, я не получаю результатов.Сначала я хотел бы получить список японских слов, и я подумал, что смогу сделать это с помощью:

import urllib
from bs4 import BeautifulSoup

url = ["https://iknow.jp/courses/566921"]
data = []
for pg in url:
 r = urllib.request.urlopen(pg)
soup = BeautifulSoup(r,"html.parser")
soup.find_all("a", {"class": "cue"})

Но я ничего не получаю, даже когда я ищу поле ответа:

responseList = soup.findAll('p', attrs={ "class" : "response"})
for word in responseList:
    print(word)

Я попытался спуститься по дереву, найдя детей, но не смог найти нужный текст.Буду благодарен за вашу помощь.Вот поля, которые я пытаюсь извлечь:

fields I'm trying to extract

После большой помощи jxpython я наткнулся на новый вызов (возможно, этодолжна быть новая тема, но она довольно родственная, так что, возможно, здесь все в порядке).Моя цель - создать фрейм данных или CSV-файл, каждая строка которого содержит японское слово, перевод и примеры с транслитерацией.Со списками, созданными с использованием:

driver.find_elements_by_class_name()
driver.find_elements_by_xpath()

Я получаю списки с различным количеством элементов, поэтому невозможно легко создать кадр данных.

# len(cues) 100
# len(responses) 100
# len(transliterations)279 stramge number because some words don't have transliterations
# len(texts) 200
# len(translations)200

Списки транслитерации содержат смесьтранслитерации для отдельных слов и предложений.Я думаю, что для получения содержимого для заполнения первой строки моего фрейма данных мне нужно было бы перебрать содержимое

<li class="item">

(xpath? # / Html / body / div 2 / div / div / section / div / section / div / div / ul / li 1 ) и для каждого извлечения слова с переводом, предложениями и транслитерацией ... Я не уверен, будет ли этохотя лучший подход ...

Например, информация, которую я хотел бы иметь в первой строке моего кадра данных (из поля, выделенного на скриншоте):

行 く, い く, иди, я езжу в библиотеку по воскресеньям.Went っ た。, я ходил в бассейн во время летних каникул.

enter image description here

1 Ответ

0 голосов
/ 12 сентября 2018

Теги, которые вы пытаетесь очистить, отсутствуют в исходном коде. Вероятно, потому что страница представлена ​​в JavaScript. Попробуйте этот URL, чтобы увидеть себя:

вид-источник: https://iknow.jp/courses/566921

Модуль Python Selenium решает эту проблему. Если хотите, я мог бы написать код для вас.

Вот код для начала:

from selenium import webdriver

url = 'https://iknow.jp/courses/566921'
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(2)

cues = driver.find_elements_by_class_name('cue')
cues = [cue.text for cue in cues]

responses = driver.find_elements_by_class_name('response')
responses = [response.text for response in responses]

texts = driver.find_elements_by_xpath('//*[@class="sentence-text"]/p[1]')
texts = [text.text for text in texts]

transliterations = driver.find_elements_by_class_name('transliteration')
transliterations = [transliteration.text for transliteration in transliterations]

translations = driver.find_elements_by_class_name('translation')
translations = [translation.text for translation in translations]

driver.close()

Примечание. Сначала необходимо установить веб-драйвер. Я выбираю хром. Вот ссылка: https://chromedriver.storage.googleapis.com/index.html?path=2.41/. Также добавьте это на свой путь! Если у вас есть другие вопросы, дайте мне знать!

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