2

Текущий Python скрипт:Python BeautifulSoup - Как извлечь этот текст

import win_unicode_console 
win_unicode_console.enable() 

import requests 
from bs4 import BeautifulSoup 

data = ''' 
<div class="info"> 
    <h1>Company Title</h1> 
    <p class="type">Company type</p> 
    <p class="address"><strong>ZIP, City</strong></p> 
    <p class="address"><strong>Street 123</strong></p> 
    <p style="margin-top:10px;"> Phone: <strong>(111) 123-456-78</strong><br /> 
     Fax: <strong>(222) 321-654-87</strong><br /> 
     Phone: <strong>(333) 87-654-321</strong><br /> 
     Fax: <strong>(444) 000-1111-2222</strong><br /> 
    </p> 
    <p style="margin-top:10px;"> E-mail: <a href="mailto:[email protected]">[email protected]</a><br /> 
    E-mail: <a href="mailto:[email protected]">[email protected]</a><br /> 
    </p> 
    <p> Web: <a href="http://www.domain.com" target="_blank">www.domain.com</a><br /> 
    </p> 
    <p style="margin-top:10px;"> ID: <strong>123456789</strong><br /> 
     VAT: <strong>987654321</strong> </p> 
    <p class="del" style="margin-top:10px;">Some info:</p> 
    <ul> 
     <li><a href="#category">&raquo; Category</a></li> 
    </ul> 
</div> 
''' 

html = BeautifulSoup(data, "html.parser") 

p = html.find_all('p', attrs={'class': None}) 

for pp in p: 
    print(pp.contents) 

возвращает следующее:

[' Phone: ', <strong>123-456-78</strong>, <br/>, '\n\t\tFax: ', <strong>321-654-87</strong>, <br/>, '\n\t\tPhone: ', <strong>87-654-321</strong>, <br/>, '\n\t\tFax: ', <strong>000-1111-2222</strong>, <br/>, '\n'] 
[' E-mail: ', <a href="mailto:[email protected]">[email protected]</a>, <br/>, '\n\tE-mail: ', <a href="mailto:[email protected]">[email protected]</a>, <br/>, '\n'] 
[' Web: ', <a href="http://www.domain.com" target="_blank">www.domain.com</a>, <br/>, '\n'] 
[' ID: ', <strong>123456789</strong>, <br/>, '\n\t\tVAT: ', <strong>987654321</strong>, ' '] 

Проблема: Я не знаю, как извлечь текст для телефона, факса и электронной почты, id, vat и создать массив из них, например:

phones = [123-456-78, 87-654-321] 
faxes = [321-654-87, 000-1111-2222] 
emails = [[email protected], [email protected]] 
id = [123456789] 
vat = [987654321] 

ответ

3

Вы можете сгруппировать данные, используя defaultdict после расщепления:

html = BeautifulSoup(data, "html.parser") 

p = html.find_all('p', attrs={'class': None}) 
from collections import defaultdict 

d = defaultdict(list) 
for pp in p: 
    spl = iter(pp.text.split(None,1)) 
    for ele in spl: 
     d[ele.rstrip(":")].append(next(spl).rstrip()) 

print(d) 
defaultdict(<class 'list'>, {'Phone': ['123-456-78', '87-654-321'], 
'Fax': ['321-654-87', '000-1111-2222'], 'E-mail': ['[email protected]', 
'[email protected]'], 'VAT': ['987654321'], 'Web': ['www.domain.com'], 
'ID': ['123456789']}) 

Разделительный текст дает списки данных дает:

['Phone:', '123-456-78', 'Fax:', '321-654-87', 'Phone:', '87-654-321', 'Fax:', '000-1111-2222'] 
['E-mail:', '[email protected]', 'E-mail:', '[email protected]'] 
['Web:', 'www.domain.com'] 
['ID:', '123456789', 'VAT:', '987654321'] 

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

Для вашего редактирования, чтобы поймать пробелы в номера факсов и телефонов просто расщепляются на линии с splitlines и разделить один раз на пробельных: из коллекций импорта defaultdict

d = defaultdict(list) 
for pp in p: 
    spl = pp.text.splitlines() 
    for ele in spl: 
     k, v = ele.strip().split(None, 1) 
     d[k.rstrip(":")].append(v.rstrip()) 

Выход:

defaultdict(<class 'list'>, {'Fax': ['(222) 321-654-87', '(444) 000-1111-2222'], 
'Web': ['www.domain.com'], 'ID': ['123456789'], 'E-mail': ['[email protected]', '[email protected]'], 
'VAT': ['987654321'], 'Phone': ['(111) 123-456-78', '(333) 87-654-321']}) 
+1

Интересно, большое спасибо! – RhymeGuy

+0

Нет, пожалуйста. –

+0

Извините, я получаю ошибку, когда номер телефона похож на '(111) 222-333-4444' – RhymeGuy

Смежные вопросы