Python 使用Selenium的Web抓取同义词表

Python 使用Selenium的Web抓取同义词表,python,selenium,screen-scraping,thesaurus,Python,Selenium,Screen Scraping,Thesaurus,我对网络抓取是相当陌生的,但我真的需要在同义词库网站上为我正在从事的一个项目做一些网络抓取。我已经成功地使用beautifulsoup4创建了一个程序,该程序要求用户输入一个单词,然后返回基于同义词库的最可能的同义词。然而,我不仅想要这些同义词,还想要每个词的同义词(同义词上方的按钮列表在同义词词典中描述)。我注意到当点击一个按钮时,类的名称也会改变,所以我做了一些挖掘,决定使用Selenium而不是beautifulsoup。 我现在有了一个代码,可以在搜索栏上写一个单词并单击它,但是,我无法

我对网络抓取是相当陌生的,但我真的需要在同义词库网站上为我正在从事的一个项目做一些网络抓取。我已经成功地使用beautifulsoup4创建了一个程序,该程序要求用户输入一个单词,然后返回基于同义词库的最可能的同义词。然而,我不仅想要这些同义词,还想要每个词的同义词(同义词上方的按钮列表在同义词词典中描述)。我注意到当点击一个按钮时,类的名称也会改变,所以我做了一些挖掘,决定使用Selenium而不是beautifulsoup。 我现在有了一个代码,可以在搜索栏上写一个单词并单击它,但是,我无法获取同义词或所述按钮,原因很简单,因为find_元素找不到任何内容,而且对于这个新元素,我恐怕使用了错误的语法

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

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

<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">
                ...
但无论如何,硒可以找到这些元素

第二部分我要同义词。以下是含义要素:

<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">
            ...
再说一次,硒元素找不到这些元素。。。 为了实现这一目标,我真的非常感谢一些帮助,即使这只是朝着正确的方向推进,而不是给出一个完整的解决方案。 希望我写下了所有需要的信息,如果没有,请让我知道。

看看这是否有效:

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()

如果使用
css选择器
,则必须对
类使用
dot

css_selector(".css-ixatld.e1cc71bi0") 
对于
id

css_selector("#headword") 
就像你在文件
.css

css选择器中
还可以使用
css中可用的其他方法
请参见
w3schools.com


Selenium将
class\u name
转换为
css选择器
,但是
class\u name()
需要一个名称,当有两个或更多名称时,Selenium会出现问题。当它将
class\u name
转换为
css\u选择器
时,它只在第一个名称之前添加
dot
,但它还需要在第二个和其他名称之前添加
dot
。因此,您必须手动添加第二个
dot

class_name("css-ixatld.e1cc71bi0")

如果使用
css选择器
,则必须对类使用点-
css选择器(.css ixatld.e1cc71bi0”)
,对id-
css选择器(“#headword”)
类名称()
需要单个名称,而当有两个名称时,
selenium
会出现问题-当它将
class\u name
转换为
css\u选择器
时,它只在第一个名称之前添加点,但在第二个名称之前也需要点。因此,您必须手动添加第二个点
类名(“css ixatld.e1cc71bi0”)
非常感谢,这就像一个符咒:)我不想实际单击它们,只需要访问文本来存储同义词。但是,我似乎无法单击按钮,因此我将尝试类似的方法。
css_selector(".css-ixatld.e1cc71bi0") 
css_selector("#headword") 
class_name("css-ixatld.e1cc71bi0")