使用BeautifulSoup和/或Selenium导航html树

问题描述 投票:0回答:1

我刚刚开始使用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)

我试图通过寻找孩子来移动树,但无法找到我想要的文本。我将非常感谢你的帮助。以下是我要提取的字段:

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

content(xpath?#/ html / body / div2 / div / div / section / div / section / div / div / ul / li1)并为每个提取翻译,句子和音译的单词...我不确定如果这是最好的方法,但......

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

去,去,去,周日去图书馆。 ,我会去纽约。我去游泳池度暑假。 ,我去游泳池度暑假。我暑假去了游泳池。

enter image description here

python-3.x selenium beautifulsoup
1个回答
1
投票

您尝试抓取的标签不在源代码中。可能是因为页面是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()

注意:首先需要安装webdriver。我选择镀铬。这是一个链接:https://chromedriver.storage.googleapis.com/index.html?path=2.41/。还要将此添加到您的路径中!如果您有任何其他问题,请告诉我们!

© www.soinside.com 2019 - 2024. All rights reserved.