我尝试为每个评论单击“更多”按钮,以便可以将这些文本评论扩展为完整内容,然后尝试刮取这些文本评论。没有点击“更多”按钮,我最终得到的是
“这个房间干净整洁。位置很好。”
我尝试了几种不同的功能来解决它,例如硒按钮单击和ActionChain,但是我想我没有正确使用它们。有人可以帮我解决这个问题吗?
以下是我当前的代码: 我没有上载整个代码来避免一些不必要的输出(试图使其变得简单)。
Col
答案 0 :(得分:1)
您在所有这些代码中最大的错误是except: pass.
,否则,很久以前您就可以解决问题。代码引发错误消息,其中包含所有信息,但您看不到它。您至少可以使用
except Exception as ex:
print(ex)
问题是move_to_element()
不能与BeautifulSoup
元素一起使用。我必须是Selenium的元素-
link = driver.find_element_by_link_text('More')
ActionChains(driver).move_to_element(link)
但是在执行了一些功能之后,Selenium需要一些时间来完成它-Python必须等待唤醒。
我不使用BeautifulSoup
来获取数据,但是如果您想使用它,请在单击所有链接后获取driver.page_source
。否则,每次点击后您都必须一次又一次地driver.page_source
。
有时,单击之后,您甚至可能不得不再次获取Selenium元素-因此,我首先获得输入以单击More
,然后再获得partial_entry
以获得评论。
我发现在第一个评论中单击More
会显示所有评论的文本,因此不需要单击所有More
。
在Firefox 69,Linux Mint 19.2,Python 3.7.5,Selenium 3.141上进行了测试
#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 ---')
编辑:
要跳过响应,我搜索所有class="wrap"
,然后在每个包装中搜索class="partial_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 ---')