2014-11-28 1 views
2

Привет Я пытаюсь получить имя, адрес и номер телефона каждого из бухгалтерских фирм на этой странице:Webscraping грязный веб-страницу с питоном и красивый суп

http://accountantlist.com.au/x123-Accountants-in-Sydney.aspx?Page=0

У меня возникли проблемы навигации по дереву, где находится информация.

Используя «красивый суп» и «запросы» в Python это, как я пытаюсь получить название компании:

import bs4 
import requests 

page = request.get('http://accountantlist.com.au/x123-Accountants-in-Sydney.aspx?Page=0') 
soup = bs4.BeautifulSoup(page.text) 

name = soup.select('......') 

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

#ctl00_ContentPlaceHolder1_dgLawyers > tbody > tr:nth-child(2) > td > table > tbody > tr:nth-child(1) > td:nth-child(1) > a

Красивый суп не будет принимать этот путь, однако. Я попробовал это без символов «>».

Второй метод, который я попытался было просто посмотреть на дерево и типа в CSS селекторов от тела вниз, где я хотел, как это:

soup.select('body table tbody tr ... etc')

Но это не работает.

Я думаю, в конце концов этот вопрос сводится к тому, как я могу написать путь, который примет прекрасный суп. Может ли кто-нибудь пролить свет на то, как я могу решить эту проблему?

Спасибо какой-либо помощи, оцененной.

ответ

2

Получить таблицу с компаниями по id и перебирать каждый table внутри:

import bs4 
import requests 

page = requests.get('http://accountantlist.com.au/x123-Accountants-in-Sydney.aspx?Page=0') 
soup = bs4.BeautifulSoup(page.content) 

for company in soup.select('table#ctl00_ContentPlaceHolder1_dgLawyers tr > td > table'): 
    name = company.a.text 
    number = company.tr.find_all('td')[-1].text 
    address = company.find_all('tr')[-1].td.text 

    print {'name': name, 'number': number, 'address': address} 

Печать:

{'address': u'Level 4. 36 Carrington St Sydney. NSW 2000', 'name': u'A D Hill & Co', 'number': u'0292991733'} 
{'address': u'Suite 103, Level 1. 84 Pitt Street Sydney. NSW 2000', 'name': u'A2Z Insolvency Solutions', 'number': u'02 8065 6607'} 
{'address': u'810 George St Sydney. NSW 2000', 'name': u'AAA iPro Services Australia', 'number': u'1300554959'} 
{'address': u'Level 39. 2 Park St Sydney. NSW 2000', 'name': u'AccFin Services', 'number': u'0290047825'} 
... 
+0

Вау, спасибо. На вашем пути, как вы можете пропустить тег «tbody», который находится под «table # ct100 ...»? – Kane

+0

@ Kane yeah, я пропускаю 'tbody' - нет необходимости всегда использовать'> 'и следовать прямым отношениям parent-child. – alecxe

+0

@Kane: 'table # ct100 ... tr' Обратите внимание на использование пробела вместо>. Это предполагает, что у вас есть только один уровень вложенности таблицы. – BoltClock

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