【问题标题】:Reading next line from html从 html 读取下一行
【发布时间】:2025-11-24 22:20:10
【问题描述】:

我正在使用 Beautiful Soup 包进行一些网页抓取,我希望能够将行放入名为 table 的字典中,其中每个键都有多个值。

这个字典代表一个表,最终会做成一个表

我已经抓取了 html 来为我提供键值,但问题是从 html 中读取下一行并匹配正确的键。

这些名称是字典键名:

RowName
UpdateTime
State
OrdersC
TicketsR
OrdersNC
TicketsNR
ReadingTime
ClearingTime
ClearingInProgress
Volumes
StartTime
StopTime

这是数据的外观(打印到控制台时):

(注意:这些结果集将超过两个)

NYBOT 
00:10:39 
Not Connected 
0 
7043 
0 
7043 
07:58:30 
--:--:-- 
0 
0 
02:30:00  
20:00:00 
MONTREAL 
N/A 
N/A 
0 
145 
0 
145 
07:59:01 
--:--:-- 
0 
0 
01:00:00  
20:00:00 

所以字典看起来像:

{RowName: [NYBOT, MONTREAL], UpdateTime: [00:10:39, N/A], ... ,  StopTime: [20:00:00,20:00:00]}

我已经尝试过了,但无济于事,因为我得到的错误是 next() 函数无法遍历字符串:

for line in site.find_all('td'):
  line  = line.strip()
  table.update(RowName = line.text.replace('\xa0', ''))
  next(line)
  .
  .
  .
  next(line)
  table.update(StopTime = line.text.replace('\xa0', ''))

【问题讨论】:

  • 像 html dom 一样解析并做一个 xpath
  • .find_all('td') 已经将每一行作为列表中的一个元素提供给您。如果您已经知道将拥有的元素的数量和顺序,则可以使用两个列表并使用以下命令创建字典:“dict(zip(keys, values))”
  • @SorenLantz,我同意。我已经尝试过 zip() 函数,但它没有按应有的方式压缩。会有不止一组结果。
  • @swagless_monk 如果是这种情况,那么 line.text.replace 可能不会返回您想要的字符串

标签: python html python-3.x beautifulsoup


【解决方案1】:

将数据放入字典,因为您已经知道元素的长度和顺序。

characteristics = ['RowName','UpdateTime','State','OrdersC','TicketsR'....'StopTime']
data = []

for line in site.find_all('td'):
    line  = line.strip()
    line.text.replace('\xa0', '')
    data.extend(line)

info = dict(zip(characteristics, data))

【讨论】:

  • 这适用于只有一个的情况,但要考虑的不止一组。尽管如此,这是一个可以接受的解决方案,也许我可以将此公式应用于有更多结果集的情况。
【解决方案2】:
<<dict_name>> = {z[0]:list(z[1:]) for z in zip(<<keys>>,<<value_1>>, <<value_2>>,..., <<value_N>>)}

这就是我创建具有多个键值的字典的诀窍

【讨论】: