无法正确捕获所需的文本

时间:2016-02-22 13:35:40

标签: python regex beautifulsoup

我是新手,我正在尝试使用python编写一个蜘蛛,但我无法得到我需要的部分,我不知道哪里出错了。 我从整个html文件中挑选出我需要的部分,如下所示。我试图使用RegEx </tr[/s]*?>(<tr[\s]*?>.*?</tr[\s]*?>)<tr[/s]*?>,但我一无所获。有没有人可以帮我解决这个问题?

PS。在使用findall收集信息之前,我已经使用sub来删除所有\n\r

提前致谢。

</tr>
<tr >
    <td style="border-bottom:3px solid #000000;"  colspan='4' rowspan='1' >

<!-- START OBJECT-CELL -->

<table bgcolor='#C0C0C0' cellspacing='0' border='0' width='100%'>

  <col align='left' />

  <col align='right' />

<tr>

  <td align='left' bgcolor='#C0C0C0'><font color='#000000'>AE1PGA/L1/01</font></td>

  <td align='right' bgcolor='#C0C0C0'><font color='#000000'>3-4</font></td>

</tr>

</table>

<table bgcolor='#C0C0C0' cellspacing='0' border='0' width='100%'>

  <col align='center' />

<tr>

  <td align='center' bgcolor='#C0C0C0'><font color='#000000'>Programming And Algorithms</font></td>

</tr>

</table>

<table bgcolor='#C0C0C0' cellspacing='0' border='0' width='100%'>

  <col align='left' />

<tr>

  <td align='left' bgcolor='#C0C0C0'><font color='#000000'></font></td>

</tr>

</table>

<!-- END OBJECT-CELL -->

    </td>

    <td style="border-bottom:3px solid #000000;"  colspan='4' rowspan='1' >

<!-- START OBJECT-CELL -->

<table bgcolor='#C0C0C0' cellspacing='0' border='0' width='100%'>

  <col align='left' />

  <col align='right' />

<tr>

  <td align='left' bgcolor='#C0C0C0'><font color='#000000'>AE1MCS/L1/01</font></td>

  <td align='right' bgcolor='#C0C0C0'><font color='#000000'>3-5, 7-15</font></td>

</tr>

</table>

<table bgcolor='#C0C0C0' cellspacing='0' border='0' width='100%'>

  <col align='center' />

<tr>

  <td align='center' bgcolor='#C0C0C0'><font color='#000000'>Mathematics For Computer Scientists</font></td>

</tr>

</table>

<table bgcolor='#C0C0C0' cellspacing='0' border='0' width='100%'>

  <col align='left' />

<tr>

  <td align='left' bgcolor='#C0C0C0'><font color='#000000'>SEB-432+</font></td>

</tr>

</table>

<!-- END OBJECT-CELL -->

    </td>

</tr>
<tr >

2 个答案:

答案 0 :(得分:0)

您的正则表达式与您显示的数据不匹配有几个原因

  • 您所指的几个地方/s \s

  • 在两种情况下,您都要求在关闭</tr>之前开始<tr>,而没有居间空间

  • 除非您设置.*?选项标记

  • ,否则您在DOTALL中使用了与新行不匹配的点。
  • 您要求连续三个<tr>元素,这些元素不会出现在您的数据中

还没有必要将[\s]放在括号中,但这不会影响模式的行为

修复这些并获得

</tr\s*?>\s*(<tr\s*?>.*?</tr\s*?>)\s*<tr\s*?>

如果HTML中有类似的内容,则会匹配,如果设置了DOTALL选项标记

但是,正如其他人所指出的那样,正则表达式并不是处理HTML的正确工具。你应该使用适当的解析器

答案 1 :(得分:0)

如果您将已发布的HTML复制到名为html的字符串中,以下脚本将向您展示BeautifulSoup如何帮助您提取所有<tr>...</tr>块:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

for table in soup.find_all('table'):
    for tr in table.find_all('tr'):
        print tr
        print '-' * 30

这将显示以下输出:

<tr>
<td align="left" bgcolor="#C0C0C0"><font color="#000000">AE1PGA/L1/01</font></td>
<td align="right" bgcolor="#C0C0C0"><font color="#000000">3-4</font></td>
</tr>
------------------------------
<tr>
<td align="center" bgcolor="#C0C0C0"><font color="#000000">Programming And Algorithms</font></td>
</tr>
------------------------------
<tr>
<td align="left" bgcolor="#C0C0C0"><font color="#000000"></font></td>
</tr>
------------------------------
<tr>
<td align="left" bgcolor="#C0C0C0"><font color="#000000">AE1MCS/L1/01</font></td>
<td align="right" bgcolor="#C0C0C0"><font color="#000000">3-5, 7-15</font></td>
</tr>
------------------------------
<tr>
<td align="center" bgcolor="#C0C0C0"><font color="#000000">Mathematics For Computer Scientists</font></td>
</tr>
------------------------------
<tr>
<td align="left" bgcolor="#C0C0C0"><font color="#000000">SEB-432+</font></td>
</tr>
------------------------------

注意,第一个<tr>不会显示,因为您发布的HTML不包含它所属的表。