Извлечение HTML извне тега <table> - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь извлечь часть HTML, расположенную выше и ниже тега <table>, например, из приведенного ниже примера HTML:

sample_html = """
<html>
<title><b>Main Title</b></Title>
<b>more</b>
<b>stuff</b>
<b>in here!</b>
<table class="softwares" border="1" cellpadding="0" width="99%">
    <thead style="background-color: #ededed">
        <tr>
            <td colspan="5"><b>Windows</b></td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><b>Type</b></td>
            <td><b>Issue</b></td>
            <td><b>Restart</b></td>
            <td><b>Severity</b></td>  
            <td><b>Impact</b></td>  
        </tr>
        <tr>
            <td>some item</td>
            <td><a href="some website">some website</a><br></td>
            <td>Yes<br></td>
            <td>Critical<br></td>
            <td>stuff<br></td>
        </tr>    
        <tr>
            <td>some item</td>
            <td><a href="some website">some website</a><br></td>
            <td>Yes<br></td>
            <td>Important<br></td>
            <td>stuff<br></td>    
        </tr>
    </tbody>
</table>
<b>AGAIN</b>
<b>more</b>
<b>stuff</b>
<b>down here!</b>
</html>
"""

Я хотел бы получить что-то вроде.

top_html = """
<html>
<title><b>Main Title</b></Title>
<b>more</b>
<b>stuff</b>
<b>in here!</b>
</html>
"""

bottom_html = """
<html>
<b>AGAIN</b>
<b>more</b>
<b>stuff</b>
<b>down here!</b>
</html>
"""

Или уже в текстовом формате, например:

top_html = 'Main Title more stuff down here!'

bottom_html = 'AGAIN more stuff down here!'

Так что я смог извлечь часть <table> из всего HTML и выполнить свою обработку (яразделите строки <tr> и столбцы <td>, чтобы я мог извлечь нужные значения) со следующим кодом:

soup = BeautifulSoup(input_html, "html.parser")
table = soup.find('table')

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Разделить HTML на таблицу HTML, а затем извлечь текст

from  bs4 import BeautifulSoup as bs

sample_html = """
<html>
<title><b>Main Title</b></Title>
<b>more</b>
<b>stuff</b>
<b>in here!</b>
<table class="softwares" border="1" cellpadding="0" width="99%">
    <thead style="background-color: #ededed">
        <tr>
            <td colspan="5"><b>Windows</b></td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><b>Type</b></td>
            <td><b>Issue</b></td>
            <td><b>Restart</b></td>
            <td><b>Severity</b></td>  
            <td><b>Impact</b></td>  
        </tr>
        <tr>
            <td>some item</td>
            <td><a href="some website">some website</a><br></td>
            <td>Yes<br></td>
            <td>Critical<br></td>
            <td>stuff<br></td>
        </tr>    
        <tr>
            <td>some item</td>
            <td><a href="some website">some website</a><br></td>
            <td>Yes<br></td>
            <td>Important<br></td>
            <td>stuff<br></td>    
        </tr>
    </tbody>
</table>
<b>AGAIN</b>
<b>more</b>
<b>stuff</b>
<b>down here!</b>
</html>
"""
soup = bs(sample_html, 'lxml')
results = str(soup).split(str(soup.select_one('table.softwares')))
top_text = bs(results[0], 'lxml').get_text().replace('\n',' ')
bottom_text = bs(results[1], 'lxml').get_text().replace('\n',' ')
print(top_text)
print(bottom_text)
1 голос
/ 07 ноября 2019

Это решение не широко использует BeautifulSoup, но работает. Получить индекс открывающих и закрывающих тегов таблицы, извлекать строки до и после.

soup = BeautifulSoup(sample_html, "html.parser")

def extract_top_and_bottom(soup):
    index_of_opening_tag = soup.index("<table")
    index_of_closing_tag = soup.index("</table>")

    top_html = soup[:index_of_opening_tag]
    bottom_html = soup[index_of_closing_tag::].replace("</table>", '')

    print(top_html)
    print(bottom_html)

extract_top_and_bottom(str(soup))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...