【问题标题】:Creating a dataframe with data extracted from a website使用从网站中提取的数据创建数据框
【发布时间】:2021-06-24 00:57:05
【问题描述】:

我正在尝试使用 selenium 从 Facebook 部分获取共享数量,如下所示:

from selenium import webdriver
import time

chrome_options = webdriver.ChromeOptions()

total = []
shares = []
comments = []
reactions = []
    
query=["www.stackoverflow.com","www.facebook.com"]
driver = webdriver.Chrome(mypath,chrome_options=chrome_options) 
driver.get('https://www.sharedcount.com/')
textarea = driver.find_element_by_xpath('//textarea')
for x in query:
     textarea.send_keys(query)
     button = driver.find_element_by_xpath("//button[@class='button button_accent-green']")
     button.click()
     body = driver.find_element_by_xpath("//tb-data tb-data_face[@class='bold-text']")
     total.append(body)
     sharing=driver.find_element_by_xpath("//tb-line-info__text tb-line-info__text_left tb-line-info__face[@class='bold-text']")
     shares.append(sharing)
     com=driver.find_element_by_xpath("//tb-line-info__text tb-line-info__text_left[@class='bold-text']")
     comments.append(com)

为查询列表中的每个 url 创建一个包含信息的新数据框。 但是,我收到此错误

InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression //tb-data tb-data_face[@class='bold-text'] because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//tb-data tb-data_face[@class='bold-text']' is not a valid XPath expression.
  (Session info: chrome=91.0.4472.114)

有谁知道如何修复错误并获得以下输出?

url                       shares         comments         reactions 
www.stackoverflow.com      11.2k           3.8k              9.1k
www.facebook.com         1920.4m           64.9m             517.7m             

使用 WebDriverWait 后,我​​得到了另一个错误:

     24 button.click()
---> 25 WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, '//td[@class="tb-data tb-data-face"]/div[@class="bold-text"]')))
     26 body = driver.find_element_by_xpath('//td[@class="tb-data tb-data-face"]/div[@class="bold-text"]')
     27 total.append(body)

~/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/support/wait.py in until(self, method, message)
     78             if time.time() > end_time:
     79                 break
---> 80         raise TimeoutException(message, screen, stacktrace)
     81 
     82     def until_not(self, method, message=''):

TimeoutException: Message: 

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping


    【解决方案1】:

    我相信您在 XPath 中缺少 <td><div> 标记。应该是

    '//td[@class="tb-data tb-data_face"]/div[@class="bold-text"]'

    您还需要使用相同的想法调整sharingcom XPath。

    编辑 1: 尝试等待元素的可见性:

    进口:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    for x in query:
         ...
         button.click()
         
         # Wait 10 seconds for the element to be visible
         WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, '//td[@class="tb-data tb-data_face"]/div[@class="bold-text"]')))
    
         body = driver.find_element_by_xpath('//td[@class="tb-data tb-data_face"]/div[@class="bold-text"]')
         total.append(body)
         ...
    

    【讨论】:

    • 我的猜测是你需要等待元素的可见性。我将编辑我的答案
    • 这是一个错字。将“td-data tb-data-face”替换为“td-data tb-data_face
    • 啊,您还需要将query=["www.stackoverflow.com","www.facebook.com"] 替换为query=["www.stackoverflow.com", "\n", "www.facebook.com"] 才能正确创建新行。
    • 您需要检查共享和 cmets 的正确 xpath。检查网站我可以看到“共享”它是'//span[@class="tb-line-info__text tb-line-info__text_left tb-line-info_face"]/div[@class="bold-text"]'。尝试自己构造“cmets”XPath 以练习 XPath 构造。如果不能,你可以问,好吗?
    • 是的。您没有从元素中提取文本。您想使用.text 提取文本。示例:driver.find_element_by_xpath("//tb-data tb-data_face[@class='bold-text']").text 重要提示:据我所知,.text 仅提取可见文本。如我所见,您需要的一些文本已折叠。在这种情况下,您可以使用.get_attribute('textContent') 来正确提取信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2020-03-03
    • 2012-12-21
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多