2016-11-25 6 views
1

Я новичок в webscraping, пытаясь разобрать веб-сайт после отправки формы с помощью robobrowser. Я возвращаю правильные данные (я могу просмотреть его, когда я это сделаю: print (browser.parsed)), но у меня проблемы с его синтаксическим анализом. Соответствующая часть исходного кода веб-страницы выглядит следующим образом:Разбор веб-страницы с robobrowser и beautifulsoup

<div id="ii"> 
<tr> 
    <td scope="row" id="t1a"> ID (ID Number)</a></td> 
    <td headers="t1a">1234567 &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1b">Participant Name</td> 
    <td headers="t1b">JONES, JOHN       &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1c">Sex</td> 
    <td headers="t1c">MALE &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1d">Date of Birth</td> 
    <td headers="t1d">11/25/2016 &nbsp;</td> 
</tr> 
<tr> 
    <td scope="row" id="t1e">Race/Ethnicity</a></td> 
    <td headers="t1e">White     &nbsp;</td> 
</tr> 

если я

in: browser.select('#t1b") 

я получаю:

out: [<td id="t1b" scope="row">Inmate Name</td>] 

вместо JONES, JOHN.

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

browser.select('tr') 

Это возвращает список каждого из 29 с каждой «тр», что я могу преобразовать в текст и искать соответствующая информация.

Я также попытался создать объект BeautifulSoup:

x = browser.select('#ii') 
soup = BeautifulSoup(x[0].text, "html.parser") 

но он теряет все теги/идентификаторами, и поэтому я не могу понять, как искать в ней.

Есть ли простой способ, чтобы он проходил через каждый элемент с помощью «tr» и получал фактические данные, а не ярлык, как противодействующие многократному преобразованию в строковую переменную и поиск по ней?

Благодаря

ответ

0

Получить все "метка" td элементы и получить next td sibling value собирающих результаты в Словаре:

from pprint import pprint 
from bs4 import BeautifulSoup 

data = """ 
<table> 
    <tr> 
     <td scope="row" id="t1a"> ID (ID Number)</a></td> 
     <td headers="t1a">1234567 &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1b">Participant Name</td> 
     <td headers="t1b">JONES, JOHN       &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1c">Sex</td> 
     <td headers="t1c">MALE &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1d">Date of Birth</td> 
     <td headers="t1d">11/25/2016 &nbsp;</td> 
    </tr> 
    <tr> 
     <td scope="row" id="t1e">Race/Ethnicity</a></td> 
     <td headers="t1e">White     &nbsp;</td> 
    </tr> 
</table> 
""" 

soup = BeautifulSoup(data, 'html5lib') 

data = { 
    label.get_text(strip=True): label.find_next_sibling("td").get_text(strip=True) 
    for label in soup.select("tr > td[scope=row]") 
} 
pprint(data) 

Печать:

{'Date of Birth': '11/25/2016', 
'ID (ID Number)': '1234567', 
'Participant Name': 'JONES, JOHN', 
'Race/Ethnicity': 'White', 
'Sex': 'MALE'} 
+0

невероятно - спасибо так много! – MikeD

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