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