python-3.x - 使用 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,日曜日図书馆に行きます,にちにちとしょかんとしょかんに。。,我在周日去图书馆。にプールにいった。,我暑假去了游泳池。
解决方案
您尝试抓取的标签不在源代码中。可能是因为页面是 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/ 。也将其添加到您的路径中!如果您有任何其他问题,请告诉我!
推荐阅读
- angular - 从角度存储中按 id 选择元素
- typo3 - 打字稿将每个第 4 个元素添加一个 div
- python - Pythonic 多态参数
- java - 如何克服java中println zoo中的错误
- c++ - 如何使用 openssl 获取 AES-CCM 解密的标签信息
- json - 插入一个大的字符串 JSON 作为突变 GRAPHQL 的输入
- spring - 创建名为“inMemoryDatabaseShutdownExecutor”的 bean 时出错:
- sql - SQL。如何使用循环?PostgreSQL
- c# - 如何在 c# 上将子集合添加到 firestore?
- node.js - 如何修复“类型错误无法读取未定义的属性 0”?