首页 > 解决方案 > 识别rowspan和colspan:使用漂亮汤的html表格

问题描述

我遇到了美丽的汤模块和重新模块的问题。我正在尝试编写一个自动将 HTML 代码转换为乳胶代码的 python 脚本。要绘制表格,我必须首先阅读 HTML 代码中的各种表格属性,例如rowspancolspan。这是我的 HTML 代码表:

<html>
<body>
   <table border = "1">
       <tr>
           <td>Name</td>
           <td colspan="2">Alice</td>
       </tr>
       <tr>
           <td>Type</td>
           <td colspan="2">Client</td>
       </tr>
       <tr>
           <td rowspan="3">Parameters</td>
           <td>Param1</td>
           <td>Value</td>
       </tr>
       <tr>
           <td>Param2</td>
           <td>Value</td>
       </tr>
       <tr>
           <td>Param3</td>
           <td>Value</td>
       </tr>
</html>

首先,我必须找到colspanrowspan出现在哪里。我编写了以下脚本来做到这一点:

import re

from bs4 import BeautifulSoup

with open('table.html')as file:
    soup = BeautifulSoup(file, 'lxml')


for table in soup.find_all("tr"):
    for item in table.find_all('td'):
        row = re.findall(r'rowspan="[0-255]"', str(item))
        col = re.findall(r'colspan="[0-255]"', str(item))
        print(row)
        print(col)


输出是:

[]
[]
[]
['colspan="2"']
[]
[]
[]
['colspan="2"']
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[Finished in 1.622s]

我很好colspan。但不行rowspan。在我的 HTML 代码的第 13 行,我有rowspan. 为什么它不在我的输出中?请帮忙。

标签: pythonhtmlpython-3.xbeautifulsoup

解决方案


这里的问题在于正则表达式。

rowspan="[0-255]"

这里 0-2 一个介于 0 到 2 和 55 之间的单个字符匹配列表 5 中的单个字符(区分大小写)。所以这个正则表达式只能匹配

  • rowspan="0"
  • rowspan="1"
  • rowspan="2"
  • rowspan="5"

您还可以使用该HTMLParser模块来解析标签属性。(它是标准库的一部分)

>>> from html.parser import HTMLParser
>>>
>>> class MyParser(HTMLParser):
...     def __init__(self, *args, **kwargs):
...         self.results = []
...         super(MyParser, self).__init__(*args, **kwargs)
...     def handle_starttag(self, tag, attrs):
...         if tag == "td":
...             for attr, value in attrs:
...                 if ("colspan" == attr) or ("rowspan" == attr):
...                     self.results.append("{}=\"{}\"".format(attr, value))
...
>>> parser = MyParser()
>>>
>>> parser.feed(
...     """
... <html>
... <body>
...    <table border = "1">
...        <tr>
...            <td>Name</td>
...            <td colspan="2">Alice</td>
...        </tr>
...        <tr>
...            <td>Type</td>
...            <td colspan="2">Client</td>
...        </tr>
...        <tr>
...            <td rowspan="3">Parameters</td>
...            <td>Param1</td>
...            <td>Value</td>
...        </tr>
...        <tr>
...            <td>Param2</td>
...            <td>Value</td>
...        </tr>
...        <tr>
...            <td>Param3</td>
...            <td>Value</td>
...        </tr>
... </html>
... """
... )
>>>
>>> print(parser.results)
['colspan="2"', 'colspan="2"', 'rowspan="3"']

推荐阅读