【问题标题】:Scraping Dynamic Information抓取动态信息
【发布时间】:2021-04-09 21:11:00
【问题描述】:

我最近开始使用编码,我使用 Python 和 Pycharm。我安装并导入了所需的“附加组件”,例如 Selenium。
对于我的第一个项目,我尝试从该网站获取“地址”信息:

https://randomstreetview.com/#fullscreen

当我使用 Chrome 开发人员工具 (F12) 时,信息显示在 div'address' 之后。经过大量的反复试验,我设法以多种方式抓取了网站,但 div 后面没有出现任何内容。
由于我查了一下,认为它是动态信息,所以我开始尝试使用 Selenium 和我在网上找到的其他代码。
没有任何效果,或者我无法使其正常工作。
每次打开网站时地址都会更改,但位置保持不变(afaik)。
任何人都可以帮助我提供工作代码或帮助我走上正确的道路吗?
我可以提供不同的方法,但我认为这不会有帮助。

【问题讨论】:

  • 发布您尝试过的代码。或者您要访问的 HTML。注意 iframe 等常见陷阱。
  • 欢迎来到 Stack Overflow!请阅读How to Ask,尤其是关于minimal reproducible example(MCVE)和How much research effort is expected?的部分,这将帮助您调试自己的程序并自己解决问题。如果您这样做并且仍然卡住,您可以返回并发布您的 MCVE、您尝试过的内容以及执行结果(包括任何错误消息),以便我们更好地帮助您。还提供指向页面和/或相关 HTML 的链接。

标签: python selenium xpath web-scraping css-selectors


【解决方案1】:

如果你想要元素的地址,只需获取元素并打印它的文本。

driver.get("https://randomstreetview.com/")
wait = WebDriverWait(driver, 10)
elem = wait.until(EC.presence_of_element_located((By.ID, "address")))
print(elem.text)

元素

<div id="address">Nordre Ringvej 97, 2600 Glostrup, Dänemark</div>

输出

Nordre Ringvej 97, 2600 Glostrup, Dänemark

进口

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

【讨论】:

    【解决方案2】:

    捎带 Arundeep Chohan 的回答。无法获取地址的原因是它是隐藏元素。

    看看这篇文章 Python Selenium: Finds h1 element but returns empty text string

    TLDR; "text 属性允许您仅从可见元素中获取文本,而 textContent 属性还允许获取隐藏元素的文本..."

    此代码也适用于 CSS 选择器

    element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div#address')))
    
    print(element.get_attribute('textContent'))
    

    【讨论】:

      【解决方案3】:

      要打印 文本 value,您可以使用以下任一 Locator Strategies

      • 使用idget_attribute("textContent")

        driver.get("https://randomstreetview.com/#fullscreen")
        print(driver.find_element_by_id("address").get_attribute("textContent"))
        
      • 使用css_selectorget_attribute("innerHTML")

        driver.get("https://randomstreetview.com/#fullscreen")
        print(driver.find_element_by_css_selector("div#address").get_attribute("innerHTML"))
        
      • 使用xpathtext属性:

        driver.get("https://randomstreetview.com/#fullscreen")
        print(driver.find_element_by_xpath("//div[@id='address']").text)  
        

      理想情况下,您需要为presence_of_element_located() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

      • 使用IDget_attribute("textContent")

        print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "address"))).get_attribute("textContent"))
        
      • 使用CSS_SELECTORtext属性:

        print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div#address"))).text)
        
      • 使用XPATHget_attribute()

        print(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@id='address']"))).get_attribute("innerHTML"))
        
      • 控制台输出:

        value
        
      • 注意:您必须添加以下导入:

        from selenium.webdriver.support.ui import WebDriverWait
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as EC
        
      • 控制台输出:

        Ciudad Pérdida 10, La Sabana, 39799 Acapulco, Guerrero, Mexico
        

      您可以在How to retrieve the text of a WebElement using Selenium - Python找到相关讨论


      参考

      链接到有用的文档:

      【讨论】:

        猜你喜欢
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-15
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 2011-09-08
        相关资源
        最近更新 更多