Как получить Beautifulsoup для анализа последовательного списка HTML в таблице в шаблон данных CSV? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть внутренняя веб-страница компании, которая перечисляет разнообразные данные в длинном списке, который я хочу преобразовать в файл CSV для просмотра.Данные имеют формат:

*CUSTOMER_1*
Email Link   Category_Text    Phone_Numbers
Email Link   Category_Text    Phone_Numbers
*Customer_2*
Email Link   Category_Text    Phone_Numbers
Email Link   Category_Text    Phone_Numbers

Закодированный в HTML, он выглядит следующим образом:

<table id="responsibility">
    <tr class="customer">
        <td colspan="6">
            <strong>CUSTOMER 1</strong>
        </td>
    </tr>
    <tr id="tr_1" title="Role_Name1">
        <td><a href="email@company.com1">Name_1</a></td>
        <td>Category_Text</td>
        <td>Phone_Numbers</td>
        <td></td>
    </tr>
    <tr id="tr_2" title="Role_Name2">
        <td><a href="email@company.com2">Name_2</a></td>
        <td>Category_Text</td>
        <td>Phone_Numbers</td>
        <td></td>
    </tr>
    <tr class="customer">
        <td colspan="6">
            <strong>CUSTOMER 2</strong>
        </td>
    </tr>
    <tr id="tr_1" title="Role_Name1">
        <td><a href="email@company.com3">Name_3</a></td>
        <td>Category_Text</td>
        <td>Phone_Numbers</td>
        <td></td>
    </tr>
    <tr id="tr_2" title="Role_Name2">
        <td><a href="email@company.com2">Name_2</a></td>
        <td>Category_Text</td>
        <td>Phone_Numbers</td>
        <td></td>
    </tr>
</table>

Я хотел бы получить файл .csv, содержащий информацию в этомfashion

   CUSTOMER1,Role_Name1,Name_1,Email_1,Category_Text,Phone_Numbers
   CUSTOMER1,Role_Name2,Name_2,Email_2,Category_Text,Phone_Numbers
   CUSTOMER2,Role_Name1,Name_3,Email_3,Category_Text,Phone_Numbers
   CUSTOMER2,Role_Name1,Name_2,Email_2,Category_Text,Phone_Numbers

Прямо сейчас я могу получить список всех имен клиентов или список всего текста, но я не смог выяснить, как перебирать каждого клиента, а затем перебиратьпо каждой строке для каждого клиента

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("source.html"), "html.parser")

with open("output.csv",'w') as file:
    responsibility=soup.find('table',{'id':'responsibility'})
    line=responsibility.tr
    for i in responsibility:
        print(line)
        line=responsibility.tr.next_sibling

Я ожидал, что это напечатает каждый тег в документе, но вместо этого он печатает только первый и никогда не циклически переходит к следующим тегам.

1 Ответ

0 голосов
/ 13 июня 2019

Сфокусируйтесь на этой строке кода:

line=responsibility.tr

Здесь вы используете тег .tr, который находит первый экземпляр блока тега <tr> и возвращает его содержимое.

Что это значит здесь?Скажем так, у вас есть n экземпляров тега <tr>, тогда использование .tr даст вам только первый экземпляр среди этих n <tr> экземпляров в результате.Итак, если вы хотите извлечь все n из них, используйте find_all () .Он вернет список всех возможных совпадений.

line=responsibility.find_all("tr", class_="customer")

Также добавьте фильтр class_="customer".Это поможет вам найти все блоки <tr> с классом «customer».Тогда простое использование .next_sibling позволит вам найти 2 последующие строки с атрибутом title="Role_Name*".

Итак, чтобы применить приведенную выше теорию на практике, посмотрите следующее:

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("source.html"), "html.parser")

with open("output.csv",'w') as file:
    responsibility=soup.find('table',{'id':'responsibility'})
    lines=responsibility.find_all("tr", class_ = "customer")
    for i in responsibility:
        for line in lines:
            line1=line.next_sibling              #locates tr with title="Role_Name1"
            line2=line.next_sibling.next_sibling #locates tr with title="Role_Name2"
            print(line1)
            print(line2)
...