python-3.x - 从 HTML 数据透视表中提取数据
问题描述
我有几个要解决的问题:
1. 1-3 列可能是合并单元格,因此缺少“td”值,如果这些列不存在 td,我如何填充每一行?或者,第 4-7 列始终可见。我正在考虑处理此问题的一种方法是向后循环以获取第 7、6、5、4 列,如果不存在第 3、2、1 列以使用前第
2 行的先前值。在第 4 列中,可以是多个值和一个或多个超链接。我需要提取文本和所有超链接以单击它们并下载附件。
如果有比硒更好的方法,请告诉我。最终输出是将此数据表和附件填充到 Excel 文件中。
Python - Selenium 代码:此代码用于按 HTML 代码('td')中的每一列提取每一行数据
table = driver.find_element_by_id('table')
row = table.find_elements_by_tag_name("tr")
for rows in row:
cols = rows.find_element_by_tag_name("td")
for col in cols:
print(col.text)
我附上了我使用 Beautiful Soup 提取的 HTML 代码,让您了解表格的外观。第一个表行有 7 个“td”,但后续行没有。
好的。所以我对col代码做了以下改进。反转循环效果很好!现在我所有的超链接将始终位于第 4 列。现在我必须找出第 1-3 列来填充每一行并打开所有超链接并将它们保存到共享驱动器上的特定文件夹中。谢谢!
columncounter = 7
cols = rows.find_elements_by_tag_name("td")
for col in reversed(cols):
print('ColumnNumber = %d' %columncounter)
print(col.text)
if columncounter == 4:
colfour = col.get_attribute('innerHTML')
colfour2 = col.find_elements_by_tag_name('a')
for a in colfour2:
print(a.get_attribute('href'))
columncounter-=1
解决方案
这可能不是最好的解决方案,但这是我为使其工作所做的工作:
from selenium import webdriver
from win32com.client as win32
xl = win32.gencache.EnsureDispatch('Excel.Application')
xl.Visible = 1
wb = xl.Workbooks.Open('Template.xlsx')
xl.DisplayAlerts = False
ws = wb.Worksheets('Sheet1')
tr = 10 # paste results into row 10 for excel table
for rows in row[1:] #skip header row
rtxt = rows.text.strip() #trim text to determine if row is empty
if rtxt: # used to determine if rtxt variable for empty row
columncounter = 7
cols = rows.find_elements_by_tag_name("td")
for col in reversed(cols):
if columncounter == 7:
col7 = col.text
elif columncounter == 6:
col6 = col.text
elif columncounter == 5:
col5 = col.text
elif columncounter ==4:
col4 = col.text
colfour = col.get_attribute('innerHTML') #get entire cell code
colfour2 = col.find_elements_by_tag_name('a')
for a in colfour2:
link = a.get_attribute('href') #extract hyperlink
linkh = 'https'
if linkh in link: #only want hyperlinks that start with https
for i in link:
col8+=i #extracts multiple link into same variable
elif columncounter == 3:
col3 = col.text
elif columncounter == 2:
col2 = col.text
elif columncounter == 1:
col1 = col.text
columncounter-=1
#paste all of the values in column into excel
dest_cell = ws.Range('A' + str(tr))
dest_cell.Value = col1
dest_cell = ws.Range('B' + str(tr))
dest_cell.Value = col2
dest_cell = ws.Range('C' + str(tr))
dest_cell.Value = col3
dest_cell = ws.Range('D' + str(tr))
dest_cell.Value = col4
dest_cell = ws.Range('E' + str(tr))
dest_cell.Value = col5
dest_cell = ws.Range('F' + str(tr))
dest_cell.Value = col6
dest_cell = ws.Range('G' + str(tr))
dest_cell.Value = col7
dest_cell = ws.Range('H' + str(tr))
dest_cell.Value = col8
tr+=1
else:
continue #skip empty rows
这将附加第 1-3 列的值,因为由于前 3 列中的合并单元格,每行的所有 7 列都没有“td”值。然后将每个值作为重复值粘贴到 excel 文件中,直到它根据 columncounter 从 col.text 检索到该列的新值。
推荐阅读
- .net-core - ASP.NET Core MVC 3.1 在短时间内注销
- python - 如何将列表从一个函数传递给一个类中的多个函数?
- python - 将 Django ForeignKey 字段连接到另一个模型时出现 NameError
- javascript - 在 react-apexcharts 中悬停时启用切片扩展
- javascript - 在特定点播放和暂停 html5 视频
- firebase - 在 Firestore 中自动创建集合
- php - PHP - 删除 xml 中的特殊字符
- javascript - 为什么开玩笑的代码覆盖率报告显示不一致的值?
- wordpress - 如何使用构建器在 Word 新闻网站中添加可点击图标
- java - Spring boot neo4j @NodeEntity with Integer property throwing error