Python单击';更多';按钮不工作

Python单击';更多';按钮不工作,python,selenium,button,click,Python,Selenium,Button,Click,我试着为每一篇评论点击“更多”按钮,这样我就可以把这些文本评论扩展到全部内容,然后我试着删掉那些文本评论。如果不单击“更多”按钮,我最终检索的内容如下 “这个房间很好很干净。位置……更多” 我尝试了一些不同的功能来解决这个问题,比如selenium按钮点击和ActionChain,但我想我没有正确地使用它们。有人能帮我解决这个问题吗 以下是我目前的代码: 我没有上传整个代码,以避免一些不必要的输出(试图使其简单化) 您在所有这些代码中最大的错误是,除了:pass。没有这个,您将在很久以前解决问题

我试着为每一篇评论点击“更多”按钮,这样我就可以把这些文本评论扩展到全部内容,然后我试着删掉那些文本评论。如果不单击“更多”按钮,我最终检索的内容如下
“这个房间很好很干净。位置……更多”

我尝试了一些不同的功能来解决这个问题,比如selenium按钮点击和ActionChain,但我想我没有正确地使用它们。有人能帮我解决这个问题吗

以下是我目前的代码: 我没有上传整个代码,以避免一些不必要的输出(试图使其简单化)


您在所有这些代码中最大的错误是
,除了:pass。
没有这个,您将在很久以前解决问题。代码引发包含所有信息的错误消息,但您无法看到它。你至少可以使用

except Exception as ex:
    print(ex)

问题是
move_to_element()
将不能与
beautifulsou
元素一起工作。我必须像硒元素一样

link = driver.find_element_by_link_text('More')

ActionChains(driver).move_to_element(link)
但是,在执行某些函数之后,Selenium需要一些时间来完成这项工作,Python必须等待

我不使用
BeautifulSoup
获取数据,但如果您想使用它,请在单击所有链接后获取
driver.page\u source
。或者,每次单击后,您都必须一次又一次地获取驱动程序

有时在单击之后,您可能需要再次获取Selenium元素-因此我首先获取条目以单击
更多
,然后获取
部分条目
,以获取评论

我发现在first review中单击
More
会显示所有评论的文本,因此它不需要单击所有
More

使用Firefox 69、Linux Mint 19.2、Python 3.7.5和Selenium 3.141进行测试



编辑:

要跳过响应,我搜索所有
class=“wrap”
,然后在每个wrap中搜索
class=“partial\u entry”
。我认为每一次总结只能是一次回顾,最终是一次回应。评论一直有一个索引
[0]
。一些包装没有保持审查,所以他们会给出一个空列表——我必须先检查它,然后才能从列表中获取元素
[0]

all_reviews = driver.find_elements_by_class_name('wrap')
#print('all_reviews:', len(all_reviews))

for review in all_reviews:
    all_entries = review.find_elements_by_class_name('partial_entry')
    if all_entries:
        print('--- review ---')
        print(all_entries[0].text)
        print('--- end ---')

您知道所有这些代码中最大的错误是
,除了:pass
。没有这一点,问题早就解决了。代码引发包含所有信息的错误消息,但您看不到。您好,感谢您修改后的评论。但看起来我同时也在检索管理层的回应(主持人对评论的评论)。文字评论和管理层的回应都属于同一类,这就是为什么。有没有办法不收集管理层的回应?还有其他功能可以搜索元素,您可以创建更复杂的规则或功能。您甚至可以使用
XPath
。在每个class=“wrap”中只有一个评论和一个管理响应-如果您首先找到所有“wrap”并在每个“wrap”中搜索评论,那么首先将是您的评论-
所有“wrap”中的评论[0]
您好,是否有任何原因说明action chain在该列表的第二页评论中不起作用评论的第二页不能点击“更多”按钮。
#from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver import ActionChains
import time

#Incognito Mode
option = webdriver.ChromeOptions()
option.add_argument("--incognito")

#Open Chrome
#driver = webdriver.Chrome(executable_path="C:/Users/chromedriver.exe",chrome_options=option)

driver = webdriver.Firefox()

#url I want to visit.
lists = ['https://www.tripadvisor.com/VacationRentalReview-g30196-d6386734-Hot_51st_St_Walk_to_Mueller_2BDR_Modern_sleeps_7-Austin_Texas.html']

for url in lists:

    driver.get(url)
    time.sleep(3)

    link = driver.find_element_by_link_text('More')

    try:
        ActionChains(driver).move_to_element(link)
        time.sleep(1) # time to move to link

        link.click()
        time.sleep(1) # time to update HTML
    except Exception as ex:
        print(ex)

    description = driver.find_element_by_class_name('vr-overview-Overview__propertyDescription--1lhgd')
    print('--- description ---')
    print(description.text)
    print('--- end ---')

    # first "More" shows text in all reviews - there is no need to search other "More"
    first_entry = driver.find_element_by_class_name('entry')
    more = first_entry.find_element_by_tag_name('span')

    try:
        ActionChains(driver).move_to_element(more)
        time.sleep(1) # time to move to link

        more.click()
        time.sleep(1) # time to update HTML
    except Exception as ex:
        print(ex)

    all_reviews = driver.find_elements_by_class_name('partial_entry')
    print('all_reviews:', len(all_reviews))

    for i, review in enumerate(all_reviews, 1):
        print('--- review', i, '---')
        print(review.text)
        print('--- end ---')
all_reviews = driver.find_elements_by_class_name('wrap')
#print('all_reviews:', len(all_reviews))

for review in all_reviews:
    all_entries = review.find_elements_by_class_name('partial_entry')
    if all_entries:
        print('--- review ---')
        print(all_entries[0].text)
        print('--- end ---')