使用Python 3和beautifulsoup4解析HTML表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python 3和beautifulsoup4解析HTML表相关的知识,希望对你有一定的参考价值。
所以我有HTML表格,我已经解析了数据,我在控制台中打印出来。
HTML代码:
<table class='hdr'><tbody>
<tr><td class='hdr_name'><b>Station ID: </b></td><td class='hdr_value'><b>TUA1-W03281</b></td></tr>
<tr><td class='hdr_name'><b>Serial Number: </b></td><td class='hdr_value'><b>C737201011071281 Nest Number : RFID = N1111003 TS = N0000001</b></td></tr>
<tr><td class='hdr_name'><b>Date: </b></td><td class='hdr_value'><b>Wednesday, July 04, 2018</b></td></tr>
<tr><td class='hdr_name'><b>Time: </b></td><td class='hdr_value'><b>9:26:25 AM</b></td></tr>
<tr><td class='hdr_name'><b>Operator: </b></td><td class='hdr_value'><b>No operator logged in</b></td></tr>
<tr><td class='hdr_name'><b>Execution Time: </b></td><td class='hdr_value'><b>118.3051362 seconds</b></td></tr>
<tr><td class='hdr_name'><b>Number of Results: </b></td><td class='hdr_value'><b>169</b></td></tr>
<tr><td class='hdr_name'><b>UUT Result: </b></td><td class='hdr_value'><b><span style="color:#008000;">Passed</span></b></td></tr>
</tbody></table>
我的代码来刮取数据:
from datetime import datetime
from bs4 import BeautifulSoup
testURL = open('Report - C737201011071281 - 04-07-18-92626 AM.128144458.html')
soup = BeautifulSoup(testURL, "html.parser")
'Station ID'
station = soup.find("td", text="Station ID: ").find_next_sibling("td").text
print("
Station ID: " + station)
'Serial Number'
serialNumber = soup.find("td", text="Serial Number: ").find_next_sibling("td").text
cNumber = serialNumber[0:15]
print("Serial Number: " + cNumber)
'Date'
date = soup.find("td", text="Date: ").find_next_sibling("td").text
datetime_object = datetime.strptime(date, '%A, %B %d, %Y')
print("Date: " + datetime_object.strftime('%Y-%m-%d'))
'Time'
time = soup.find("td", text="Time: ").find_next_sibling("td").text
time_object = datetime.strptime(time, '%I:%M:%S AM')
print("Time: " + time_object.strftime('%H:%M:%S'))
'Result'
result = soup.find("td", text="UUT Result: ").find_next_sibling("td").text
print("UUT Result: " + result)
后来在HTML中使用的表没有类或id,我想要做的就是能够遍历每一行,直到找到一个包含“Focus”字样的行。找到这一行后,我想浏览该行下面的每一行,直到我到达其中包含单词“Result”的行。
下面是关于如何创建表的HTML:
<tr><td class='label' colspan='2' style="border-color:#000000;background-color:#FFFFFF;"> Focus:</td>
</tr>
<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;"> Centre_Score:</td>
<td class='value' style="border-color:#000000;background-color:#32FFFF;"><span style='white-space:nowrap;'>0.08565902709961</span></td></tr>
<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;"> Top_Left_Score:</td>
<td class='value' style="border-color:#000000;background-color:#32FFFF;"><span style='white-space:nowrap;'>0.06830544769764</span></td></tr>
<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;"> Top_Right_Score:</td>
<td class='value' style="border-color:#000000;background-color:#32FFFF;"><span style='white-space:nowrap;'>0.06978666782379</span></td></tr>
<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;"> Bottom_Right_Score:</td>
<td class='value' style="border-color:#000000;background-color:#32FFFF;"><span style='white-space:nowrap;'>0.06947886943817</span></td></tr>
<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;"> Bottom_Left_Score:</td>
<td class='value' style="border-color:#000000;background-color:#32FFFF;"><span style='white-space:nowrap;'>0.07671363651752</span></td></tr>
<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;"> Result:</td>
<td class='value' style="border-color:#000000;background-color:#32FFFF;"><span style='white-space:nowrap;'>1</span></td></tr>
如何在具有文本“Focus:”的行之后迭代每一行,并将每个参数的值存储在名为“Focus Results”的数组中。我是Python新手,非常感谢任何反馈,尤其是我创建的.py脚本。
答案
也许你想做这样的事情:首先搜索“Focus:”,然后迭代其父级的兄弟(其他行)。您可以在res词典中获得所需的结果。
all_labels = soup.find_all("td", class_="label")
res={}
for label in all_labels:
if 'Focus' in label.text:
for sib in label.parent.next_siblings:
if isinstance(sib, Tag):
lab = sib.find('td', class_='label').text.strip()
val = sib.find('td', class_='value').text.strip()
res[lab] = val
if 'Result' in lab: break
break;
print res
另一答案
您可以尝试这样来实现预期的输出:
for items in soup.find_all("td"):
if "Focus" in items.text:
data = items.find_parent("tr")
for elem in data.find_next_siblings():
if "Result" in elem.find(class_="label").text:break
item = elem.find(class_="label").get_text(strip=True)
value = elem.find(class_="value").get_text(strip=True)
print(f'{item} {value}')
输出:
Centre_Score: 0.08565902709961
Top_Left_Score: 0.06830544769764
Top_Right_Score: 0.06978666782379
Bottom_Right_Score: 0.06947886943817
Bottom_Left_Score: 0.07671363651752
以上是关于使用Python 3和beautifulsoup4解析HTML表的主要内容,如果未能解决你的问题,请参考以下文章
在jupyter的python 3.5中导入beautifulsoup4时出错