【问题标题】:Parsing HTML table using Python 3 and beautifulsoup4使用 Python 3 和 beautifulsoup4 解析 HTML 表格
【发布时间】:2018-12-18 13:22:27
【问题描述】:

所以我有 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("\nStation 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”一词的行。找到这一行后,我想遍历该行下方的每一行,直到到达其中包含“结果”一词的行。

下面是关于如何创建表格的 HTML:

<tr><td class='label' colspan='2' style="border-color:#000000;background-color:#FFFFFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Focus:</td>
</tr>

<tr><td class='label' style="border-color:#000000;background-color:#FFFFFF;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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 脚本,我将不胜感激。

【问题讨论】:

    标签: python python-3.x web-scraping beautifulsoup html-parsing


    【解决方案1】:

    也许你想做这样的事情: 您首先搜索“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
    

    【讨论】:

    • 但是如果没有,你想返回什么值?解析此 HTML 部分的结果是什么?
    • 如果你有两行都是标签,即“Focus_Threshold”和“Centre_Threshold”。 'Centre_Threshold' 是 Focus 的一个子参数,所以我想将它包含在我的输出中,如下所示。 Focus_Threshold:{'Centre_Threshold:''min val','max val','Corner_Threshold:','min val','max val'&lt;tr&gt;&lt;td class='label' &gt;Focus_Threhold:&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td class='label' &gt;Centre_Threshold:&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td class='label' &gt;Minimum:&lt;/td&gt; &lt;td class='value' '&gt;0&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td class='label' &gt;Maximum:&lt;/td&gt; &lt;td class='value''&gt;0&lt;/td&gt;&lt;/tr&gt;
    • 这部分和上一个有什么关系? “焦点”和“结果”之间是焦点阈值吗?
    • 我有一行叫做“焦点阈值”,下面有一行叫做“中心阈值”。两者都没有“价值”类。 “焦点”基本上有两个参数,称为“中心”和“角”,它们有称为“最大”、“最小”的参数。我想做的是像这样打印出来: Focus_Threshold: {'Centre_Threshold: ' 'min val', 'max val', 'Corner_Threshold: ', 'min val', 'max val' 所以我需要寻找“值”类并从“中心”和“角”阈值返回“最大值”和“最小值”的值
    • 我明白了,但这个问题在上一个问题中。从某种意义上说,“焦点”和“结果”行之间是“焦点阈值”和“中心阈值”吗?或者和html前面的部分无关。
    【解决方案2】:

    你可以尝试这样来达到预期的输出:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-28
      • 2021-08-03
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多