【发布时间】:2017-06-27 18:52:48
【问题描述】:
我有一个存储在字符串中的值。我只想将该值附加到满足特定条件的行,而不是其他任何行。
下图显示了我需要解析的表。我可以使用BeautifulSoup 轻松解析文件并将其转换为Pandas DataFrame,但对于下面的两个表格,我正在努力捕获Package 价格并将其附加到整个DataFrame。理想情况下,价格值将与每个鱼重对一起出现;所以单列具有相同的价格值。
这是我用来解析表格的代码:
with open(file_path) as in_f:
msg = email.message_from_file(in_f) #type: <class 'email.message.Messgae'>
html_msg = msg.get_payload(1) #type: <class 'email.message.Message'>
body = html_msg.get_payload(decode=True) #type: <class 'bytes'> or type: 'int'
html = body.decode() #type: <class 'str'>
tablez = BeautifulSoup(html).find_all("table") #type: <class 'bs4.element.ResultSet'>
data = []
for table in tablez:
for row in table.find_all("tr"):
data.append([cell.text.strip() for cell in row.find_all("td")])
fish_frame = pd.DataFrame(data)
这就是data 是:
data: [['Species', 'Price', 'Weight'], ['GBW Cod', '.55', '8,059'], ['GBE Haddock', '.03', '14,628'], ['GBW Haddock', '.02', '87,451'], ['GB YT', '1.50', '1,818'], ['Witch', '1.25', '1,414'], ['GB Winter', '.40', '23,757'], ['Redfish', '.02', '123'], ['White Hake', '.40', '934'], ['Pollock', '.02', '7,900'], ['Package Price:', '', '$21,151.67'], ['Species', 'Weight'], ['GBE Cod', '820'], ['GBW Cod', '15,279'], ['GBE Haddock', '32,250'], ['GBW Haddock', '192,793'], ['GB YT', '6,239'], ['SNE YT', '2,018'], ['GOM YT', '1,511'], ['Plaice', '2,944'], ['Witch', '1,100'], ['GB Winter', '158,608'], ['White Hake', '31'], ['Pollock', '1,983'], ['SNE Winter', '7,257'], ['Price', '$58,500.00'], ['Species', 'Weight'], ['GBE Cod', '792'], ['GBW Cod', '14,767'], ['GBE Haddock', '29,199'], ['GBW Haddock', '174,556'], ['GB YT', '5,268'], ['SNE YT', '544'], ['GOM YT', '1,957'], ['Plaice', '2,452'], ['Witch', '896'], ['GB Winter', '163,980'], ['White Hake', '8'], ['Pollock', '1,743'], ['SNE Winter', '3,709'], ['Price', '$57,750.00']]
然后我使用这段代码来捕获Package的价格:
stew = BeautifulSoup(html, 'html.parser')
chunks = stew.find_all('p', {'class' : "MsoNormal"})
for line in chunks:
if 'Package' in line.text:
package_price = line.text
print("package_price:", package_price)
但我现在正在努力将该价格值添加到数据框中自己的列中。执行fish_frame = pd.DataFrame(package_price) 之类的命令会导致:
Traceback (most recent call last):
File "Z:/Code/NEFS_stock_then_weight_attempt3.py", line 236, in <module>
fish_frame = pd.DataFrame(package_price)
File "C:\Users\stephen.mahala\AppData\Local\Programs\Python\Python35-32\lib\site-packages\pandas\core\frame.py", line 345, in __init__
raise PandasError('DataFrame constructor not properly called!')
pandas.core.common.PandasError: DataFrame constructor not properly called!
由于我不知道的原因。但是,将其转换为 list 会导致字符串被分解,并且每个字符都成为自己的列表,因此每个字符都成为 DataFrame 中自己的单元格。
有没有我不知道的带有Pandas 或BeautifulSoup 的方法可以简化将这个单一值添加到我的DataFrame 的过程?
【问题讨论】:
-
您应该修改您的问题,以显示您收到的错误的完整、具体的追溯。
-
我在解析表格后立即在我的第一块代码中创建
fish_frame -
是的,我知道你是如何创建/初始化它的,你能显示 full 回溯吗?
-
好的。添加了完整的错误消息。
-
data用于构造数据帧的 exact 输出是什么?
标签: python pandas email dataframe beautifulsoup