[英]Saving all the columns from a html table using beautiful soup in python
我嘗試將兩種行從網站轉換為表格。
第一張長這樣
<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)
但是我的 output 看起來像這樣,
['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"]
不太可能找到合適的模式,所以這里我們使用 go。 除了正則表達式,我想不出任何東西來獲得標題,因為它沒有綁定到確定的標簽。
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', '']
我相信你能得到的最接近的(假設你的所有行都保持模式)是這樣的:
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)
Output:
['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()])
這會將 output 更改為:
['All Day', 'Holiday', 'French - Flower Festival', 'France']
['01:00', 'AUS', 'Australian Budget (Dec)', '-5M', '-2M', 'Australia', 'Revised From -3M']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.