Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用错误的HTML表进行美化组解析_Python_Regex_Beautifulsoup - Fatal编程技术网

Python 使用错误的HTML表进行美化组解析

Python 使用错误的HTML表进行美化组解析,python,regex,beautifulsoup,Python,Regex,Beautifulsoup,我试图用BeautifulSoup解析类似于以下的表,以提取每个人的姓名、年龄和职位 <TABLE width="100%" align="center" cellspacing="0" cellpadding="0" border="0"> <TR> <TD></TD> <TD></TD> <TD align="center" nowrap colspan="3"><FONT s

我试图用BeautifulSoup解析类似于以下的表,以提取每个人的姓名、年龄和职位

<TABLE width="100%" align="center" cellspacing="0" cellpadding="0" border="0">

<TR>
    <TD></TD>
    <TD></TD>
    <TD align="center" nowrap colspan="3"><FONT size="2"><B>Age as of</B></FONT></TD>
    <TD></TD>
    <TD></TD>
</TR>

<TR>
    <TD align="center" nowrap><FONT size="2"><B>Name</B></FONT></TD>
    <TD></TD>
    <TD align="center" nowrap colspan="3"><FONT size="2"><B>November 1, 1999</B></FONT></TD>
    <TD></TD>
    <TD align="center" nowrap><FONT size="2"><B>Position</B></FONT></TD>
</TR>

<TR>
    <TD align="center" nowrap><HR size="1"></TD>
    <TD></TD>
    <TD align="center" nowrap colspan="3"><HR size="1"></TD>
    <TD></TD>
    <TD align="center" nowrap><HR size="1"></TD>
</TR>

<TR>
    <TD align="left" valign="top"><FONT size="2">
    Terry S. Jacobs</FONT></TD>
    <TD></TD>
    <TD></TD>
    <TD align="right" valign="top" nowrap><FONT size="2">57</FONT></TD>
    <TD></TD>
    <TD></TD>
    <TD align="left" valign="top"><FONT size="2">
    Chairman of the Board, Chief Executive Officer, Treasurer and
    director</FONT></TD>
</TR>

<TR><TD><TR><TD><TR><TD><TR><TD>

<TR>
    <TD align="left" valign="top"><FONT size="2">
    William L. Stakelin</FONT></TD>
    <TD></TD>
    <TD></TD>
    <TD align="right" valign="top" nowrap><FONT size="2">56</FONT></TD>
    <TD></TD>
    <TD></TD>
    <TD align="left" valign="top"><FONT size="2">
    President, Chief Operating Officer, Secretary and director</FONT></TD>
</TR>

<TR><TD><TR><TD><TR><TD><TR><TD>

<TR>
    <TD align="left" valign="top"><FONT size="2">
    Joel M. Fairman</FONT></TD>
    <TD></TD>
    <TD></TD>
    <TD align="right" valign="top" nowrap><FONT size="2">70</FONT></TD>
    <TD></TD>
    <TD></TD>
    <TD align="left" valign="top"><FONT size="2">
    Vice Chairman and director</FONT></TD>
</TR>

</TABLE>
事情对第一个人来说是有用的,但坏的。。。排队真的把事情搞得一团糟。我尝试对几千个HTML文件执行此操作,每个文件的表结构略有不同。这就是说,未关闭和标记的此功能在文件中非常常见


有没有人想过如何将上述解析推广到具有类似结构的表?非常感谢

您可以利用以下事实:valign属性在所有要保留的字段中都设置为top,而在所有不保留的字段中都设置为top:

soup = BeautifulSoup(in_file)
cells = [cell.text.strip() for cell in soup('td', valign='top')]
然后,您可以将此单元格列表排序为二维结构。每个条目有三个单元格,因此您只需执行以下操作即可将其分类:

entries = []
for i in range(0, len(cells), 3):
    entries.append(cells[i:i+3])

如果其他人不太可能遇到这个问题并在这里绊倒,现代的解决方案是更改您正在使用的解析器。默认解析器“html.parser”在使用足够接近的html和正确关闭的标记时非常好,但是第二次您必须处理边缘情况,如下面的示例1,这类似于OP问题,即使在8年后,下面的示例2仍然会被忽略

在BeautifulSoup4当前版本4.9.3的文档中,有一节详细介绍了解析器的选择:

示例1,原始HTML:

<TABLE >
  <TR VALIGN="top">
    <td>&nbsp;<td><b>Title:</b>
    <td>&nbsp;title is here <i>-subtitle</i><br>
  <TR VALIGN="top">
    <td>&nbsp;
    <td><b>Date:</b>
    <td>&nbsp;Thursday , August 27th, 2020
  <TR VALIGN="top">
    <td>&nbsp;<td><b>Type:</b>
    <td>&nbsp;61
  <TR VALIGN="top">
    <td>&nbsp;
    <td><b>Status:</b>
    <td>&nbsp;ACTIVE - ACTIVE
</TABLE>
示例3,使用BeautifulSouphtml“html5lib”时的结果:

标题: 标题在这里-副标题 日期: 2020年8月27日,星期四 类型:  61 地位: 主动-主动
还有一些外部用C编写的解析器,如“lxml”,您可以使用它们,根据文档,这些解析器的速度要快得多。

谢谢。我应该更清楚一点,我在数千个具有类似HTML表的文件上使用了这个解析器。不清楚所有具有此属性的表是否都像这样设置,所以我尝试对代码进行更一般的处理。有额外的和标记而没有匹配的结束标记似乎很常见,所以这就是我使用的示例。啊,对不起。我想我还是不确定到底是什么问题。BS的重点是纠正草率的HTML;它将自动关闭未关闭的s和s。s将标准化为。如果不需要,请筛选行列表,例如filterlambda行:lenrow'td'>1,soup'tr'。也许我还没有帮上忙,在这种情况下我真的很抱歉。它似乎没有像这样立即关闭标签。它似乎在接近终点的时候关闭了它们。由于嵌套,这导致输出中的名称大量重复:William L.Stakelin、William L.Stakelin、William L.Stakelin、William L.Stakelin、William L.Stakelin、William L.Stakelin、57岁、总裁、首席运营官、秘书兼董事Joel M.Fairman、Joel M.Fairman、Joel M.Fairman、Joel M.Fairman、Joel M.Fairman、Joel M.Fairman、70岁、,副主席兼董事Fred L.Murr。。。这是输出的一个条目,它将继续运行一段时间。非常感谢你的帮助。哦,哇,这根本不是我看到的。我在bs4和bs3中试过,得到了同样整洁的标签关闭。一个想法是:我的in_文件正是您上面提供的HTML。如果实际的文件有更多的内容,我想这会对BS选择关闭标记的方式产生影响。除此之外,我不确定问题可能是什么。祝你好运
<TABLE >
  <TR VALIGN="top">
    <td>&nbsp;<td><b>Title:</b>
    <td>&nbsp;title is here <i>-subtitle</i><br>
  <TR VALIGN="top">
    <td>&nbsp;
    <td><b>Date:</b>
    <td>&nbsp;Thursday , August 27th, 2020
  <TR VALIGN="top">
    <td>&nbsp;<td><b>Type:</b>
    <td>&nbsp;61
  <TR VALIGN="top">
    <td>&nbsp;
    <td><b>Status:</b>
    <td>&nbsp;ACTIVE - ACTIVE
</TABLE>
<table>
<tr valign="top">
<td> <td><b>Title:</b>
<td> title is here <i>-subtitle</i><br/>
<tr valign="top">
<td>
    <td><b>Date:</b>
<td> Thursday , August 27th, 2020
  <tr valign="top">
<td> <td><b>Type:</b>
<td> 61
  <tr valign="top">
<td>
    <td><b>Status:</b>
<td> ACTIVE - ACTIVE
</td></td></td></tr></td></td></td></tr></td></td></td></tr></td></td></td></tr></table>