Python 漂亮的汤,html表格解析
我目前在尝试将表解析为数组时遇到了一些问题 我有一个简单的表(),我需要用BS4解析它,并将单元格内容放入一个数组中。让事情变得困难的是,单元格不包含文本,而是包含具有以下标题的图像: “确认”或“站点”-这只是用户权限的内容。 [我正在跳过包含复选框的第一行,我可以毫无问题地提取这些复选框] 如果您查看上面的fiddle,我需要做的就是以这样一种方式解析它,结果数组变成:Python 漂亮的汤,html表格解析,python,beautifulsoup,html-table,html-parsing,Python,Beautifulsoup,Html Table,Html Parsing,我目前在尝试将表解析为数组时遇到了一些问题 我有一个简单的表(),我需要用BS4解析它,并将单元格内容放入一个数组中。让事情变得困难的是,单元格不包含文本,而是包含具有以下标题的图像: “确认”或“站点”-这只是用户权限的内容。 [我正在跳过包含复选框的第一行,我可以毫无问题地提取这些复选框] 如果您查看上面的fiddle,我需要做的就是以这样一种方式解析它,结果数组变成: Array1[0] = User1,Confirm,Confirm,Site,Confirm Array1[1] = Us
Array1[0] = User1,Confirm,Confirm,Site,Confirm
Array1[1] = User2,Confirm,Confirm,Confirm,Confirm
Array1[2] = User3,Confirm,Confirm,Confirm,Confirm
Array1[3] = User4,Confirm,Site,Site,Confirm
这样我就可以随心所欲了。
另一个复杂问题是,有时行数会有所不同,因此脚本应该能够适应这种情况,并从表中递归创建数组
目前我唯一的希望是。。在过去的10个小时里,我自己做这件事,几乎没有成功,坦白说,我已经失去了希望。我最接近得到一些东西是在封闭的标记中提取的,但由于某些奇怪的原因,无法进一步解析,也许是bs4的嵌套限制?请大家看一看,看能不能找到一种方法?或者至少解释一下如何到达那里
var解释:
rightml-桌上的汤。
allusers = []
rows = rightml.findAll('tr')
for tr in rows:
cols = tr.findAll('td')
for td in cols:
if (td.find(title="Group")) or (td.find(title="User")):
text = ''.join(td.text.strip())
allusers.append(text)
print allusers
gifrights = []
rows7 = rightml.findAll('td')
#print rows7
for tr7 in rows:
cols7 = tr7.findAll('img')
for td7 in cols7:
if (td7.find(title="Confirm")) or (td7.find(title="Site")):
text = ''.join(td7.text.strip())
text2 = text.split(' ')
print text2
gifrights.append(text2)
我可能会被这个密码弄得太离谱了。。但是我在大学里试过了。你喜欢这项工作吗:
rows = soup.find('tbody').findAll('tr')
for row in rows:
cells = row.findAll('td')
output = []
for i, cell in enumerate(cells):
if i == 0:
output.append(cell.text.strip())
elif cell.find('img'):
output.append(cell.find('img')['title'])
elif cell.find('input'):
output.append(cell.find('input')['value'])
print output
这将产生以下结果:
[u'Logged-in users', u'True', u'True', u'True', u'True']
[u'User 1', u'Confirm', u'Confirm', u'Site', u'Confirm']
[u'User 2', u'Confirm', u'Confirm', u'Confirm', u'Confirm']
[u'User 3', u'Confirm', u'Confirm', u'Confirm', u'Confirm']
[u'User 4', u'Confirm', u'Site', u'Site', u'Confirm']
我认为对行本身使用列表理解会更快
rows = soup.find('tbody').findAll('tr')
for i in rows[1:]: # the first row is thrown out
[j['title'] for j in i.findAll('img')]
这给了你
['User', 'Confirm', 'Confirm', 'Site', 'Confirm']
['User', 'Confirm', 'Confirm', 'Confirm', 'Confirm']
['User', 'Confirm', 'Confirm', 'Confirm', 'Confirm']
['User', 'Confirm', 'Site', 'Site', 'Confirm']
您可以使用嵌套列表理解删除更多步骤:
# superpythonic
[[j['title'] for j in i.findAll('img')] for i in rows[1:]]
# all together now, but not so pythonic
[[j['title'] for j in i.findAll('img')] for i in soup.find('tbody').findAll('tr')[1:]]
您实际上不需要用户#,因为用户#是索引号+1
[[j['title'] for j in i.findAll('img') if j['title'] != 'User'] for i in rows[1:]]
但是,如果你必须有一个
for i in xrange(len(users)):
users[i].append("User " + str(i+1))
但是,如果您坚持这样做,我会使用namedtuple
作为数据结构,而不是列表
然后,一旦你有了一个名为tuple的实例,比如说,用户1是User
,你就可以
>>> user.num
... 1
>>> user.col_1
... 'Confirm'
>>> user.col_2
... 'Confirm'
>>> user.col_3
... 'Site'
>>> user.col_4
... 'Confirm'
我一回家就去检查。但如果这样做有效的话,你肯定可以拥有我所有的互联网!我试过你的方法,也试过上面的方法,都很有效。非常感谢您的解释和建议!
>>> user.num
... 1
>>> user.col_1
... 'Confirm'
>>> user.col_2
... 'Confirm'
>>> user.col_3
... 'Site'
>>> user.col_4
... 'Confirm'