我是新手,我正在尝试使用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 >
答案 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不包含它所属的表。