【问题标题】:Cannot properly capture text needed无法正确捕获所需的文本
【发布时间】:2016-02-22 13:35:39
【问题描述】:

我是新手,我试图用 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 >

【问题讨论】:

  • Argh 不要自己解析 HTML,为此使用一个库:beautifulsoup4: pypi.python.org/pypi/beautifulsoup4(尤其是正则表达式对于这项工作来说是个糟糕的工具)
  • @RvdK 我试过bs4,但也不能正常工作,所以我必须自己做
  • bs4 不适合你怎么办?
  • 你到底想从这个 HTML 中提取什么?您的预期输出是什么?
  • 如果你使用soup.find_all('tr') 之类的东西可能会发生这种情况,但在 bs4 中过滤 &lt;tr&gt;s 比使用正则表达式要容易得多

标签: python regex beautifulsoup


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢一百万,这很有帮助。
【解决方案2】:

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

  • /s 在几个地方你的意思是\s

  • 您要求关闭&lt;/tr&gt; 在这两种情况下紧接在打开&lt;tr&gt; 之前,没有中间空间

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

  • 您要求三个连续的 &lt;tr&gt; 元素,它们不会出现在您的数据中

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

修复这些,你会得到

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

如果 HTML 中有类似的内容,并且您设置了 DOTALL 选项标志,则将匹配

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多