2014-11-23 3 views
1

Я пытаюсь извлечь данные со страницы, которую я соскоблил с Интернета, и мне кажется, что это довольно сложно. Я попробовал soup.get_Text(), но это не хорошо, поскольку он просто возвращает одиночные символы в строке вместо целых строковых объектов.Извлечение данных из html-doc с помощью BeautifulSoup

Извлечь название легко, потому что вы можете получить к нему доступ с помощью 'b'-tag, но, например, извлечение улицы («Am Vogelwäldchen 2») оказывается довольно сложным. Я мог бы попытаться собрать адрес из отдельных символов, но это кажется чрезмерно сложным, и я чувствую, что должен быть более простой способ сделать это. Может быть, у кого-то есть лучшая идея. О, и не против странной функции, я вернул суп, потому что я пробовал разные методы.

import urllib.request 
import time 

from bs4 import BeautifulSoup 


#Performs a HTTP-'POST' request, passes it to BeautifulSoup and returns the result 
def doRequest(request): 
    requestResult = urllib.request.urlopen(request) 
    soup = BeautifulSoup(requestResult) 
    return soup 

def getContactInfoFromPage(page): 
    name = '' 
    straße = '' 
    plz = '' 
    stadt = '' 
    telefon = '' 
    mail = '' 
    url = '' 

    data = [ 
      #'Name', 
      #'Straße', 
      #'PLZ', 
      #'Stadt', 
      #'Telefon', 
      #'E-Mail', 
      #'Homepage' 
      ] 

    request = urllib.request.Request("http://www.altenheim-adressen.de/schnellsuche/" + page) 
    request.add_header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8") 
    request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0") 
    soup = doRequest(request) 

    #Save Name to data structure 
    findeName = soup.findAll('b') 
    name = findeName[2] 
    name = name.string.split('>') 

    data.append(name) 


    return soup 


soup = getContactInfoFromPage("suche2.cfm?id=267a0749e983c7edfeef43ef8e1c7422") 

print(soup.getText()) 
+0

Спасибо, я попробую, что, когда я вернусь домой. –

ответ

0

Вы можете рассчитывать на метке поля и получить текст next sibling «s.

Создание хороший многоразовые функции из этого сделает более прозрачным и простым в использовании:

def get_field_value(soup, field): 
    field_label = soup.find('td', text=field + ':') 
    return field_label.find_next_sibling('td').get_text(strip=True) 

Использование:

print(get_field_value(soup, 'Name')) # prints 'AWO-Seniorenzentrum Kenten' 
print(get_field_value(soup, 'Land')) # prints 'Deutschland' 
+0

Большое спасибо, что сработало отлично. –

+0

@FreshPrince рад, что это помогло, спасибо. – alecxe

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