Определение rowspan и colspan: html table с использованием красивого супа - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с модулем красивого супа и модулем re. Я пытаюсь написать сценарий python, который автоматически преобразует код HTML в код латекса. Чтобы нарисовать таблицы, мне нужно сначала прочитать различные атрибуты таблицы в коде HTML, например rowspan и colspan. Вот моя таблица в коде 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>

Сначала мне нужно найти, где появляются colspan и rowspan. Для этого я написал следующий скрипт:

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. В 13-й строке моего кода HTML у меня есть rowspan. Почему его нет в моем выводе? Пожалуйста, помогите.

1 Ответ

1 голос
/ 29 мая 2020

Проблема здесь с регулярным выражением.

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"']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...