我正试图抓一些亚马逊的问题和答案,特别是这个: https://www.amazon.com/ask/questions/Tx1AYFFVMESHMZV/ref=ask_ql_ql_al_hza
这是每个问题的html部分(可以在开发人员工具中进行html检查以获取更多详细信息):
<span class="askExpanderContainer noScriptNotDisplayExpander">
<span class="askShortText">
They definitely help stretch the toes. I'm hoping to avoid a hammer toe that has been developing on one foot, and I'm not sure they're doing that, but I read that one way to avoid hammer toes developing is to stretch the toes, so I figure they will help in the long run and probably won't do any harm. From the beginning…
<a class="a-link-normal askSeeMore" href="#">
see more
</a>
</span>
<span class="askLongText">
They definitely help stretch the toes. I'm hoping to avoid a hammer toe that has been developing on one foot, and I'm not sure they're doing that, but I read that one way to avoid hammer toes developing is to stretch the toes, so I figure they will help in the long run and probably won't do any harm. From the beginning never hurt my toes, so I didn't have an adjustment period like some people have described. I use them every day, and I enjoy being calm and still for half an hour or 45 minutes while all I do is stretch my toes. That's worth something too!
<a class="a-link-normal askSeeLess" href="#">
see less
</a>
</span>
</span>
我需要完整的答案,但是当我尝试查找askLongText元素时,我收到以下错误:
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such
element: Unable to locate element: {"method":"css selector","selector":"span.askLongText"}
(Session info: chrome=66.0.3359.181)
(Driver info: chromedriver=2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011),platform=Mac OS X 10.13.4 x86_64)
但是,我可以成功提取askShortText元素。
这是python代码:
driver.get(url)
title = driver.find_element_by_css_selector('p.a-size-large.askAnswersAndComments.askWrapText').text
answers_section = driver.find_element_by_css_selector('div.a-section.askAnswersAndComments.askWrapText')
answers = answers_section.find_elements_by_xpath('div[@id]')
for ans in answers:
answer = ans.find_element_by_css_selector('span.askLongText').text
print answer
注意:最后三个答案元素不包含askLongText类。我稍后会处理异常但是没有把它放在这里用于测试目的。无论哪种方式,前三个元素确实包含这样的类,其内容应该打印,但这不会发生
答案 0 :(得分:2)
这对我有用。
see_more_links = driver.find_elements_by_partial_link_text("see more")
for link in see_more_link:
link.click()
answers = driver.find_elements_by_css_selector("span.askLongText")
for answer in answers:
print str(answer.text).replace('see less', '')
<强>输出:强>
他们绝对有助于伸展脚趾。我希望避免锤子 一只脚一直在发展的脚趾,我不确定它们是不是 这样做,但我读到,避免锤头发展的一种方法是 伸展脚趾,所以我认为从长远来看它们会有所帮助 可能不会造成任何伤害。从一开始就不会伤到我的脚趾,所以 我没有像一些人所描述的调整期。一世 每天使用它们,我喜欢平静,仍然半小时 或45分钟,而我所做的只是伸展我的脚趾。这值得 也是一件事!
他们绝对会重新调整你的脚趾并矫正你的脚骨。 您需要在开始时定期使用它们来设置它们 直。在你的疼痛减轻一点后,你可以降低疼痛 频率和延长你穿的时间。他们帮了我 在过去几周里,拇囊炎的痛苦程度要小得多。好 值得$ IMO,绝对比手术好!!
我不知道要永久地佩戴它们需要多长时间 改善对齐。瑜伽脚趾非常有助于释放脚和脚 脚趾紧张,这确实改善了我的步行和平衡。因为 我已经在一只脚上有一个拇囊炎,我怀疑这些有助于保持 在那只脚的对齐,但瑜伽脚趾帮助我的脚更好地适应 那个拇囊炎。
答案 1 :(得分:1)
@ GPT14的答案接近完美,但有一个小错误,因为该解决方案还打印文本看得少以及每个答案,这基本上不是答案的一部分。要仅提取确切答案,您可以使用以下代码块:
代码块:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://www.amazon.com/ask/questions/Tx1AYFFVMESHMZV/ref=ask_ql_ql_al_hza")
see_more_links = driver.find_elements_by_css_selector("span.askShortText>a")
for link in see_more_links:
link.click()
long_answer_texts = driver.find_elements_by_xpath("//span[@class='askLongText']")
for long_answer_text in long_answer_texts:
print(driver.execute_script('return arguments[0].firstChild.textContent;', long_answer_text).strip())
控制台输出:
他们绝对有助于伸展脚趾。我希望避免单脚发展的锤头,我不确定他们是这样做的,但我读到一种避免锤头形成的方法是伸展脚趾,所以我想他们从长远来看会有所帮助,可能不会造成任何伤害。从一开始就不会伤到我的脚趾,所以我没有像一些人所描述的调整期。我每天都使用它们,我喜欢保持冷静,仍然需要半小时或45分钟,而我所做的只是伸展脚趾。这也是值得的!
他们绝对会重新调整你的脚趾并矫正你的脚骨。您需要在开始时定期使用它们以将它们设置得更直。疼痛消退后,您可以降低频率并延长佩戴时间。在过去的几周里,他们帮助我的拇囊炎变得更加痛苦。非常值得$ IMO,绝对比手术好!!
我不知道要穿多久才能永久改善对齐。瑜伽脚趾非常有助于释放脚和脚趾的紧张,这确实改善了我的行走和平衡。因为我已经在一只脚上有一个拇囊炎,我怀疑这些会有助于保持那只脚的对齐,但瑜伽脚趾可以帮助我的脚更好地适应那种拇囊炎。
答案 2 :(得分:0)
如果您希望一次性获得所有答案,则下面的脚本值得尝试:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.amazon.com/ask/questions/Tx1AYFFVMESHMZV/ref=ask_ql_ql_al_hza")
for showmore in driver.find_elements_by_css_selector(".askSeeMore"):
showmore.click()
for ans in driver.find_elements_by_css_selector("[id^='answer-']"):
if "askLongText" in ans.get_attribute("class"):
print(ans.find_element_by_css_selector(".askLongText").text)
else:
print(ans.find_element_by_css_selector("span").text)
driver.quit()
答案 3 :(得分:0)
我调试了你的代码。下面提到的代码行:
answer = ans.find_element_by_css_selector('span.askLongText').text
抛出异常,因为元素span
并不仅包含文本。 anchor
标记中有span
个标记。要获取元素span
的完整内容,您必须使用.get_attribute('innerHTML')
。
您必须将代码行更改为:
answer = ans.find_element_by_css_selector('span.askLongText').get_attribute('innerHTML')
在答案中,您将获得span
元素的完整内容。
答案 4 :(得分:0)
假设您既想要长答案又想要测试“看到更多”链接的功能......使用更复杂的定位器和一些python魔法,我们可以:
修剪开始和结束空白的每个答案
answers = driver.find_elements_by_css_selector("div[id^='answer'] > span:not([class]), div[id^='answer'] span.askLongText")
for answer in answers:
strings = driver.execute_script("return arguments[0].innerText", answer).splitlines()
print([s.strip() for s in strings if s.strip()][0])