Python 无法正确捕获所需的文本

Python 无法正确捕获所需的文本,python,regex,beautifulsoup,Python,Regex,Beautifulsoup,我是新手,我试图用python编写一个spider,但我无法得到我需要的部分,我不知道哪里出了问题。 我从整个html文件中选择我需要的部分,如下所示。我试图使用RegEx(.*),但什么也没有得到。有人能帮我解决这个问题吗 另外,在使用findall收集信息之前,我已经使用sub删除了所有\n和\r 提前谢谢 </tr> <tr > <td style="border-bottom:3px solid #000000;" colspan='4' rows

我是新手,我试图用python编写一个spider,但我无法得到我需要的部分,我不知道哪里出了问题。 我从整个html文件中选择我需要的部分,如下所示。我试图使用RegEx
(.*)
,但什么也没有得到。有人能帮我解决这个问题吗

另外,在使用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 >

AE1PGA/L1/01
3-4
程序设计与算法
AE1MCS/L1/01
3-5, 7-15
计算机科学家的数学
SEB-432+

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

  • 您在几个地方有
    /s
    ,您的意思是
    \s

  • 在这两种情况下,您要求closin
    紧跟在开口
    之前,没有中间空间

  • 您在
    *?
    中使用的点与换行符不匹配,除非您设置
    DOTALL
    选项标志

  • 您要求三个连续的
    元素,这些元素没有出现在您的数据中

也不需要将
[\s]
放在括号中,但这不会影响模式的行为

修好这些,你就可以

</tr\s*?>\s*(<tr\s*?>.*?</tr\s*?>)\s*<tr\s*?>
\s*(.*)\s*
如果HTML中有类似的内容,并且设置了
DOTALL
选项标志,则匹配


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

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

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>
------------------------------

AE1PGA/L1/01
3-4
------------------------------
程序设计与算法
------------------------------
------------------------------
AE1MCS/L1/01
3-5, 7-15
------------------------------
计算机科学家的数学
------------------------------
SEB-432+
------------------------------

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

Argh不要自己解析HTML,为此使用一个库:beautifulsoup4:(特别是regex是一个不适合此工作的工具)@RvdK我尝试过bs4,但它也不能正常工作,所以我必须自己去做。bs4对你来说不正常吗?你到底想从这个HTML中提取什么?您的预期输出是什么?如果您使用类似于
soup.find_all('tr')
的东西,可能会出现这种情况,但是在bs4中过滤这些
要比使用regexThanks一百万容易得多,这非常有帮助。