【问题标题】:Saving all the columns from a html table using beautiful soup in python使用python中的漂亮汤保存html表中的所有列
【发布时间】:2022-02-03 07:54:23
【问题描述】:

我尝试将两种行从网站转换为表格。

第一个是这样的,

<tr id="eventRowId_750"> <td class="first left">All Day</td> <td class="flagCur left"><span class="ceFlags France float_lang_base_1" data-img_key="France" title="France"> </span></td> <td class="left textNum sentiment"><span class="bold">Holiday</span></td> <td class="left event" colspan="6">French - Flower Festival</td> </tr>

第二种行是这样的,

<tr class="js-event-item revised" data-event-datetime="2022/02/02 01:00:00" event_attr_id="114" id="eventRowId_444333"> <td class="first left time js-time" title="">01:00</td> <td class="left ImageCur noWrap"><span class="ceImages Australia" data-img_key="Australia" title="Australia"> </span> AUS</td> <td class="left textNum sentiment noWrap" data-img_key="bull1" title="Low Impact"><i class="grayFullBullishIcon"></i><i class="grayEmptyBullishIcon"></i><i class="grayEmptyBullishIcon"></i></td> <td class="left event" title="Click to view more info on Australian Budget"><a href="australian-budget-114" target="_blank">      Australian Budget  (Dec)</a> </td> <td class="bold act blackFont event-444333-actual" id="eventActual_444333" title="">-5M</td> <td class="fore event-444333-forecast" id="eventForecast_444333"> </td> <td class="prev greenFont event-444333-previous" id="eventPrevious_444333"><span title="Revised From -3M">-2M</span></td> <td class="alert js-injected-user-alert-container" data-event-id="114" data-name="Australian Budget" data-status-enabled="0"> <span class="js-plus-icon alertBellGrayPlus genToolTip oneliner" data-tooltip="Create Alert" data-tooltip-alt="Alert is active"></span> </td> </tr>

我正在尝试使用 python 和 beautifulsoup 将它们转换为行。我使用以下代码,

for items in soup.select("tr"):
    data = [item.get_text(strip=True) for item in items.select("th,td")]
    print(data)

但我的输出是这样的,

['All Day', '', 'Holiday', 'French - Flower Festival']
['01:00', 'AUS', '', 'Australian Budget  (Dec)', '-5M', '', '-2M', '']

我怎样才能让我将“低影响”文本放入第一列中“假期”的第三列,并将第一行中的名称“法国”保存到第二列中并使其看起来像这样?

['All Day', 'France', 'Holiday', 'French - Flower Festival']
['01:00', 'AUS', 'Low Impact', 'Australian Budget  (Dec)', '-5M', '', '-2M', '']

这部分并不是很重要,但是,如果跨度标题存在,是否可以通过将其添加到列表末尾来保存它?它说“从-3M修订”的部分。所以它可能看起来像这样,

['All Day', '', 'Holiday', 'French - Flower Festival']
['02:45', 'AUS', 'Low Impact', 'Australian Budget  (Dec)', '-5M', '', '-2M', '', "Revised From -3M"]

【问题讨论】:

  • 我在您的 html 中没有看到 All DayFrance
  • 对不起@JackFleeting 我修好了,请看一下
  • 您是否在第一个&lt;tr&gt; 的第一个&lt;span&gt;data-img_key 属性的输出中获得France
  • 我不能把它弄出来这就是我问的原因
  • 但是可以的

标签: javascript python html css beautifulsoup


【解决方案1】:

不太可能找到合适的模式,所以我们开始吧。除了正则表达式,我想不出任何东西来获得标题,因为它没有绑定到确定的标签。

from bs4 import BeautifulSoup
import re

with open("example.html") as html_doc:
    soup = BeautifulSoup(html_doc, "html.parser")

for items in soup.select("tr"):
    row = []
    for item in items.select("th,td"):
        text = item.get_text(strip=True)
        if not text:
            title = re.search(r"title=\"(.*?)\"", str(item))
            if title:
                text = title.group(1)
        row.append(text)
    print(row)
# output
['All Day', 'France', 'Holiday', 'French - Flower Festival']
['01:00', 'AUS', 'Low Impact', 'Australian Budget (Dec)', '-5M', '', '-2M', '']

【讨论】:

  • 嘿@BcK 你的方法几乎可以满足我的要求,但现在它在列表中的字符串末尾缺少国家/地区名称
【解决方案2】:

我相信你能得到的最接近的(假设你的所有行都保持模式)是这样的:

for items in soup.select("tr"):
    row = [item.text.strip()  for item in items.select('td')]+\
          [item['title'] for item in items.select('span[title]')]    
    print(row)

输出:

['All Day', '', 'Holiday', 'French - Flower Festival', 'France']
['01:00', 'AUS', '', 'Australian Budget  (Dec)', '-5M', '', '-2M', '', 'Australia', 'Revised From -3M']

显然,您需要对行进行操作以排除不需要的元素。例如,要删除空元素,您可以将最后一行更改为:

print([element for element in row if element.strip()])

这会将输出更改为:

['All Day', 'Holiday', 'French - Flower Festival', 'France']
['01:00', 'AUS', 'Australian Budget  (Dec)', '-5M', '-2M', 'Australia', 'Revised From -3M']

【讨论】:

  • 嗨,你是怎么使用元素线的?
  • 您缺少 'Low Impact' 值。同样根据他的预期输出,您不应该丢弃第二行中的空字符串。
  • @BcK 正确;正如我所说,这是我在没有为特定 html 手工定制选择器的情况下能得到的最接近的结果。空元素消除是可选的,因为 OP 表示他可能有兴趣这样做。
  • 嘿@JackFleeting 我看不到显示低影响的第二列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2018-11-03
  • 2020-02-13
  • 1970-01-01
相关资源
最近更新 更多