首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Selenium抓取主题库

使用Selenium抓取主题库
EN

Stack Overflow用户
提问于 2021-06-01 00:00:59
回答 2查看 167关注 0票数 0

我是相当新的网络刮刮世界,但我真的需要做一些网页抓取在主题词库网站上的一个项目,我正在工作。我已经成功地创建了一个使用beautifulsoup4的程序,该程序要求用户输入一个单词,然后返回最有可能的同义词。然而,我不仅希望拥有这些同义词,而且也希望拥有每个单词的同义词(这是由同义词上方的按钮列表描述的)。我注意到当单击一个按钮时,类的名称也会发生变化,所以我做了一些调查,决定使用Selenium而不是漂亮的汤。我现在有了一段代码,可以在搜索栏上写一个单词并单击它,但是,我无法获得同义词或上述按钮,仅仅因为find_element找不到任何东西,而且我担心我使用了错误的语法。

这是我目前的代码(查找“good”的同义词):

代码语言:javascript
复制
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 selenium.webdriver.common.keys import Keys
import time

PATH = "C:\Program Files (x86)\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(PATH)

driver.get("https://thesaurus.com")

search = driver.find_element_by_id("searchbar_input")
search.send_keys('good')
search.send_keys(Keys.RETURN)

try:
    headword = WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.ID, "headword"))
    )
    
    print(headword.text)
    #buttons = headword.find_element_by_class_name("css-bjn8wh e1br8a1p0")
    #print(buttons.text)

    meanings = WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.ID, "meanings"))
    )
    print(meanings.text)

    #words = meanings.find_elements_by_class_name("css-1kg1yv8 eh475bn0")
    #print(words.text)
    
    

except:
    print('failed')
    driver.quit()

对于第一部分,我想访问按钮。头字只是包含我想要按的所有按钮的元素。这是根据检查工具的标题元素:

代码语言:javascript
复制
<div id="headword" class="css-bjn8wh e1br8a1p0">
    <div class="css-vw3jp5 e1ibdjtj4">
         *unecessary stuff*
    <div class="css-bjn8wh e1br8a1p0">
        <div class="postab-container css-cthfds ew5makj3">
            <ul class="css-gap396 ew5makj2">
                <li data-test-pos-tab="true" class="active-postab css-kgfkmr ew5makj4"> 
                    <a class="css-sc11zf ew5makj1">
                        <em class="css-1v93s5a ew5makj0">adj.</em>
                        <strong>pleasant, fine</strong>
                    </a>
                </li>
                <li data-test-pos-tab="true" class=" css-1ha4k0a ew5makj4">
                     *similar stuff*
                <li data-test-pos-tab="true" class=" css-1ha4k0a ew5makj4">
                ...

每个<li data-test-pos-tab="true" class=" css-1ha4k0a ew5makj4">都是我想点击的按钮。到目前为止,我已经尝试了一系列类似于代码中显示的东西,还有一些类似的东西:

代码语言:javascript
复制
buttons = headword.find_elements_by_class_name("css-1ha4k0a ew5makj4")
buttons = headword.find_elements_by_css_selector("css-1ha4k0a ew5makj4")
buttons = headword.find_elements_by_class_name("postab-container css-cthfds ew5makj3")
buttons = headword.find_elements_by_css_selector("postab-container css-cthfds ew5makj3")

但无论如何,Selenium可以找到这些元素。

在第二部分,我想要同义词。以下是意义元素:

代码语言:javascript
复制
<div id="meanings" class="css-16lv1yi e1qo4u831">
    <div class="css-1f3egm3 efhksxz0">
        *unecessary stuff*
    <div data-testid="word-grid-container" class="css-ixatld e1cc71bi0">
        <ul class="css-1ngwve3 e1ccqdb60">
            <li>
                <a font-weight="inherit" href="/browse/acceptable" data-linkid="nn1ov4" class="css-1kg1yv8 eh475bn0">
                </a>
            </li>
            <li>
                <a font-weight="inherit" href="/browse/bad" data-linkid="nn1ov4" class="css-1kg1yv8 eh475bn0">
            ...

其中每个元素都是我想要得到的同义词。类似于上一个案例,我尝试了几种方法,如:

代码语言:javascript
复制
synGrid = meanings.find_element_by_class_name("css-ixatld e1cc71bi0")
synGrid = meanings.find_element_by_css_selector("css-ixatld e1cc71bi0")
words = meanings.find_elements_by_class_name("css-1kg1yv8 eh475bn0")
words = meanings.find_elements_by_css_selector("css-1kg1yv8 eh475bn0")

再一次硒找不到这些元素。为了实现这一点,我真的很感激你提供一些帮助,即使这只是朝着正确的方向推进,而不是给出一个完整的解决方案。希望我写了所有需要的信息,如果没有,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-02 11:15:14

如果您使用css selector,那么您就必须为class使用dot

代码语言:javascript
复制
css_selector(".css-ixatld.e1cc71bi0") 

hash for id

代码语言:javascript
复制
css_selector("#headword") 

就像您在.css文件中使用的那样

css selector中,您也可以使用在CSS中可维护的其他方法。

css选择器 on w3schools.com

Selenium将class_name转换为css selector,但是class_name()需要一个名称,当有两个或多个名称时Selenium会出现问题。当它将class_name转换为css_selector时,它只在名字之前添加dot,但在第二个名称和其他名称之前也需要dot。所以您必须手动添加第二个dot

代码语言:javascript
复制
class_name("css-ixatld.e1cc71bi0")
票数 0
EN

Stack Overflow用户

发布于 2021-06-01 19:31:32

看看这是否有效:

代码语言:javascript
复制
meanings = driver.find_elements_by_xpath(".//div[@id='meanings']/div[@data-testid='word-grid-container']/ul/li")
for e in meanings:
    e.find_element_by_tag_name("a").click()
    //Add a implicit wait if you need
    driver.back()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67781287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档