BeautifulSoup解析器
在我們使用BeautifulSoup的時候,選擇怎樣的解析器是至關重要的。使用不同的解析器有可能會出現不同的結果!
今天遇到一個坑,在解析某html的時候。使用html.parser解析器自己將table標簽截斷了(當然這與html本身有直接關系)
原html如下
<table cellpadding="0" cellspacing="0" style="WIDTH: 426.85pt; BORDER-COLLAPSE: collapse; MARGIN-LEFT: 0pt">
<tbody>
<tr>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 24.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">排序</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 93.75pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">中標候選人名稱</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 80.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">投標報價</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 87.45pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">質量</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 85.8pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">工期/交貨期</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 23.35pt">
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 24.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">1</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 93.75pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: 'Calibri','sans-serif'; FONT-SIZE: 10.5pt"><span style="FONT-FAMILY: 宋體; FONT-SIZE: 12pt">西安大唐電信有限公司</span>
</p>
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"></p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 80.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: 'Calibri','sans-serif'; FONT-SIZE: 10.5pt"><span style="FONT-FAMILY: 宋體; FONT-SIZE: 12pt">RMB8,029,283.00</span><span style="FONT-FAMILY: 宋體; FONT-SIZE: 12pt">元</span>
</p>
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"></p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 87.45pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: 'Calibri','sans-serif'; FONT-SIZE: 10.5pt"><span style="FONT-FAMILY: 宋體; FONT-SIZE: 12pt">合格</span>
</p>
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"></p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 85.8pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: 'Calibri','sans-serif'; FONT-SIZE: 10.5pt"><span style="FONT-FAMILY: 宋體; FONT-SIZE: 12pt">滿足招標文件要求</span>
</p>
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"></p>
</td>
</tr>
<tr>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 24.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">2</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 93.75pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 80.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 87.45pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 85.8pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
</tr>
<tr>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 24.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">3</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 93.75pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 80.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 87.45pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 85.8pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
</td>
</tr>
</tbody>
</table>
渲染效果為
排序 |
中標候選人名稱 |
投標報價 |
質量 |
工期/交貨期 |
1 |
西安大唐電信有限公司 |
RMB8,029,283.00元 |
合格 |
滿足招標文件要求 |
2 |
|
|
|
|
3 |
|
|
|
|
但是使用html.parser解釋器的話html修改為了
<table cellpadding="0" cellspacing="0" style="WIDTH: 426.85pt; BORDER-COLLAPSE: collapse; MARGIN-LEFT: 0pt">
<tbody>
<tr>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 24.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">排序</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 93.75pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">中標候選人名稱</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 80.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">投標報價</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 87.45pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">質量</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 85.8pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: middle; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt; FONT-WEIGHT: bold">工期/交貨期</span>
</p>
</td>
</tr>
<tr style="HEIGHT: 23.35pt">
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 24.55pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt">1</span>
</p>
</td>
<td style="BORDER-BOTTOM: #000000 0.75pt solid; BORDER-LEFT: #000000 0.75pt solid; PADDING-LEFT: 5.03pt; WIDTH: 93.75pt; PADDING-RIGHT: 5.03pt; VERTICAL-ALIGN: top; BORDER-TOP: #000000 0.75pt solid; BORDER-RIGHT: #000000 0.75pt solid">
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"><span style="FONT-SIZE: 10.5pt"> </span>
</p>
<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: 'Calibri','sans-serif'; FONT-SIZE: 10.5pt"><span style="FONT-FAMILY: 宋體; FONT-SIZE: 12pt">西安大唐電信有限公司</span>
</p>
<p style="LINE-HEIGHT: 150%; WIDOWS: 0; MARGIN: 0pt; ORPHANS: 0; FONT-SIZE: 10.5pt"></p>
</td>
</tr>
</tbody>
</table>
渲染效果為
排序 |
中標候選人名稱 |
投標報價 |
質量 |
工期/交貨期 |
1 |
西安大唐電信有限公司 |
BeautifulSoup官方推薦使用lxml
推薦使用lxml作為解析器,因為效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必須安裝lxml或html5lib, 因為那些Python版本的標准庫中內置的HTML解析方法不夠穩定.
提示: 如果一段HTML或XML文檔格式不正確的話,那么在不同的解析器中返回的結果可能是不一樣的,查看 解析器之間的區別 了解更多細節