首页 > 解决方案 > 使用 BeautifulSoup 和/或 Selenium 导航 html 树

问题描述

我刚开始使用 BeautifulSoup,一开始就遇到了障碍。我查找了类似的帖子,但没有找到解决我的具体问题的方法,或者有一些我不理解的基本内容。我的目标是从这个页面中提取带有英语翻译和示例的日语单词。

https://iknow.jp/courses/566921

并将它们保存在 dataFrame 或 csv 文件中。

我能够看到解析的输出和一些标签的内容,但是每当我尝试用我感兴趣的类请求某些东西时,我都没有得到任何结果。首先,我想获得一个日语单词列表,我想我应该能够做到:

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)

我尝试通过寻找孩子来向下移动树,但无法找到我想要的文本。我会很感激你的帮助。以下是我要提取的字段:

我要提取的字段

在 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)并为每个提取带有翻译、句子和音译的单词...我不确定这是否是最好的方法......

例如,我希望在我的数据框的第一行中拥有的信息(来自屏幕截图中突出显示的框)是:

行く,go,go,日曜日図书馆に行きます,にちにちとしょかんとしょかんに。。,我在周日去图书馆。にプールにいった。,我暑假去了游泳池。

在此处输入图像描述

标签: python-3.xseleniumbeautifulsoup

解决方案


您尝试抓取的标签不在源代码中。可能是因为页面是 JavaScript 渲染的。试试这个网址看看自己:

查看源代码: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/ 。也将其添加到您的路径中!如果您有任何其他问题,请告诉我!


推荐阅读