【问题标题】:How can I parse table data from website using Selenium?如何使用 Selenium 解析网站中的表格数据?
【发布时间】:2018-02-07 05:35:53
【问题描述】:

我正在尝试解析 [网站][1] 中的表格

[1]: http://www.espncricinfo.com/rankings/content/page/211270.html 使用硒,因为我是初学者。我正在努力做到这一点这是我的代码

from bs4 import BeautifulSoup
import time
from selenium import webdriver

url = "http://www.espncricinfo.com/rankings/content/page/211270.html"
browser = webdriver.Chrome()

browser.get(url)
time.sleep(3)
html = browser.page_source
soup = BeautifulSoup(html, "lxml")

print(len(soup.find_all("table")))
print(soup.find("table", {"class": "expanded_standings"}))

browser.close()
browser.quit()

我试过了,我无法从中获取任何信息,任何建议都会非常有帮助,谢谢

【问题讨论】:

    标签: python python-3.x selenium parsing web-scraping


    【解决方案1】:

    您要查找的表在 iframe 内。因此,要从该表中获取数据,您需要先切换 iframe,然后再执行其余操作。这是您可以做到的一种方法:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("http://www.espncricinfo.com/rankings/content/page/211270.html")
    wait = WebDriverWait(driver, 10)
     ## if any different table you expect to have then just change the index number within nth-of-type()
     ## and the appropriate name in the selector
    wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[name='testbat']:nth-of-type(1)")))
    for table in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "table tr")))[1:]:
        data = [item.text for item in table.find_elements_by_css_selector("th,td")]
        print(data)
    driver.quit()
    

    在这种情况下,最好的方法如下。没有使用浏览器模拟器。仅使用了requestsBeautifulSoup

    import requests
    from bs4 import BeautifulSoup
    
    res = requests.get("http://www.espncricinfo.com/rankings/content/page/211270.html")
    soup = BeautifulSoup(res.text,"lxml")
     ## if any different table you expect to have then just change the index number 
     ## and the appropriate name in the selector
    item = soup.select("iframe[name='testbat']")[0]['src']
    req = requests.get(item)
    sauce = BeautifulSoup(req.text,"lxml")
    for items in sauce.select("table tr"):
        data = [item.text for item in items.select("th,td")]
        print(data)
    

    部分结果:

    ['Rank', 'Name', 'Country', 'Rating']
    ['1', 'S.P.D. Smith', 'AUS', '947']
    ['2', 'V. Kohli', 'IND', '912']
    ['3', 'J.E. Root', 'ENG', '881']
    

    【讨论】:

    • 如何处理页面中的其他表格,它们都包含相同的框架名称?我试图用不同的属性调用我得到错误说没有这样的框架,使用硒方法。
    • 我刚刚更新了我的帖子,描述了该怎么做。如果还有什么不清楚的,请询问。您现在可以从该页面访问每个表。只需根据需要更改参数即可。
    • 如果我尝试废弃其他表,它们都包含相同的框架名称,我不能使用每个表唯一的 href,它会给我语法错误,我只能使用漂亮的汤来做到这一点方法,但我们可以用硒来做吗?
    • 你可以在 selenium 选择器 iframe[name='testbat']:nth-of-type(1)iframe[name='testbat']:nth-of-type(2)iframe[name='odibat']:nth-of-type(1)iframe[name='odibat']:nth-of-type(2) 等中进行更改。
    • 如何在字典列表中获得结果,例如 [{'country': 'AUS', 'Rank': '1', 'Name': 'S.P.D. Smith','Rating':'947'},{'country':'IND','Rank':'2','Name':'V. Kohli','Rating':'912'},{'country':'ENG','Rank':'3','Name':'J.E.根','评级':'881'}这个?在 bs4 中
    【解决方案2】:

    该页面的表格似乎在 iframe 中。如果您有要抓取的特定表格,请尝试使用浏览器开发工具检查它(右键单击,检查 Chrome 中的元素)并找到包装它的 iframe 元素。 iframe 应该有一个src 属性,该属性包含一个指向实际上 包含该表的页面的URL。然后,您可以使用与您尝试过的方法类似的方法,但改用 src url。

    如果您知道如何在页面的源代码中找到 iframe,Selenium 也可以“跳转到”iframe。 frame = browser.find_element_by_id("the_iframe_id") browser.switch_to.frame(frame) html = browser.page_source

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2012-05-06
      • 2019-05-15
      • 1970-01-01
      相关资源
      最近更新 更多