【问题标题】:Extracting Data from a Table in HTML using Selenium and Python使用 Selenium 和 Python 从 HTML 中的表中提取数据
【发布时间】:2018-06-18 16:44:19
【问题描述】:

我的任务是从 HTML 表格的每一行中提取一些项目。我已经想出了如何使用 Selenium 和 Python 从网络上抓取整个表格。以下是代码:

from selenium import webdriver
import time 
import pandas as pd

mydriver = webdriver.Chrome('C:/Program Files/chromedriver.exe')
mydriver.get("https://www.bseindia.com/corporates/ann.aspx?expandable=0")

time.sleep(5) # wait 5 seconds until DOM will load completly
table = mydriver.find_element_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_lblann"]/table/tbody')

for row in table.find_elements_by_xpath('./tr'):
    print(row.text)

我无法理解如何从桌子上抓取特定物品。以下是我需要的物品:

  1. 公司名称

  2. PDF链接(如果不存在,写“无PDF链接”)

  3. 接收时间

  4. 推定时间

  5. 花费时间

  6. 说明

逻辑方面的任何帮助都会有所帮助。 提前致谢。

【问题讨论】:

  • 除非需要使用 Selenium,否则您可以仅使用 BeautifulSoup 解析所有数据,因为数据不是使用 Javascript 动态加载的。
  • 例如table = soup.find('table', attrs={'cellpadding':"4", 'cellspacing':"1", 'width':"100%", 'border':"0"})会获取整个表,然后用table.find_all('tr')获取表中的每一行。例如row.find('td', attrs={'class': "TTHeadergrey"} 将获得项目 1、2-6。 row.find('a', attrs={'class':"tablebluelink"})['href'] 将获得 PDF 链接。
  • 如果有没有PDF链接的公司公告,我如何验证事实,我需要添加“没有PDF链接”。我实际上正在制作一张我收集的所有物品的表格。因此,我需要与表中正确公司链接的正确 PDF 链接。由于中间会有一些随机公司没有PDF链接,我不明白如何处理该错误并确保我在网页上没有PDF链接的公司旁边写了“没有PDF链接”。跨度>
  • 我也按照你告诉我的方式做了。这在列表中给了我额外的“无 PDF 链接”。这是我使用的逻辑: s = soup.find_all('td', {'class' : 'TTHeadergrey'}) for item in s: if not item.has_attr('style') 而不是 item.has_attr ('valign'): pdf.append("No PDF Link") else: for i in item.select('a'): if i.has_attr('href') and '.pdf' in i['href' ]: pdf.append(i['href'])
  • 如果我想明智地做到这一点,我该怎么做?

标签: python selenium web-scraping


【解决方案1】:
for tr in mydriver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_lblann"]/table//tr'):
    tds = tr.find_elements_by_tag_name('td')
    print ([td.text for td in tds])

【讨论】:

  • 您好,感谢您尝试回答这个问题,您能简要解释一下您的解决方案如何解决 OP 的问题吗?
  • 感谢 sunitha 的回答。根据您的建议,它为我提供了所有文本的二维数组。在这方面我有 2 个问题: 1. 如何根据我需要的不同内容对其进行格式化。 2. 如何获取每份公司公告的PDF链接。另外,如果公司公告没有 PDF,我需要一个“没有 PDF 链接”。
  • 如果我想明智地执行这一行怎么办?你觉得我会怎么做?
【解决方案2】:

我经历了一段艰难的时期来完成这项工作。我认为它现在工作得很好。虽然它的效率很低。以下是代码:

from selenium import webdriver
import time 
import pandas as pd
from selenium.common.exceptions import NoSuchElementException

mydriver = webdriver.Chrome('C:/Program Files/chromedriver.exe')
mydriver.get("https://www.bseindia.com/corporates/ann.aspx?expandable=0")
time.sleep(5) # wait 5 seconds until DOM will load completly

trs = mydriver.find_elements_by_xpath('//*[@id="ctl00_ContentPlaceHolder1_lblann"]/table/tbody/tr')
del trs[0]

names = []
r_time = []
d_time = []
t_taken = []
desc = []
pdfs = []
codes = []

i = 0
while i < len(trs):
    names.append(trs[i].text)

    l = trs[i].text.split()
    for item in l:
        try:
            code = int(item)
            if code > 100000:
                codes.append(code)
        except:
            pass

    link = trs[i].find_elements_by_tag_name('td')
    pdf_count = 2
    while pdf_count < len(link):
        try:
            pdf = link[pdf_count].find_element_by_tag_name('a')
            pdfs.append(pdf.get_attribute('href'))
        except NoSuchElementException:
            pdfs.append("No PDF")
        pdf_count = pdf_count + 4

    time = trs[i + 1].text.split()
    if len(time) == 5:
        r_time.append("No Time Given")
        d_time.append(time[3] + " " + time[4])
        t_taken.append("No Time Given")
    else:
        r_time.append(time[3] + " " + time[4])
        d_time.append(time[8] + " " + time[9])
        t_taken.append(time[12])

    desc.append(trs[i+2].text)

    i = i + 4

df = pd.DataFrame.from_dict({'Name':names,'Description':desc, 'PDF Link' : pdfs,'Company Code' : codes, 'Received Time' : r_time, 'Disseminated Time' : d_time, 'Time Taken' : t_taken})
df.to_excel('corporate.xlsx', header=True, index=False) #print the data in the excel sheet. 

另外,我添加了另一个被问到的方面,我也在另一列中获得了公司代码。 Thats the result I get.

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2011-10-16
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多