2013-12-12 2 views
1

Чтобы предисловие, я начинаю питонов, и это мой первый раз, используя BeautifulSoup. Любой вход очень приветствуется.Как я могу лучше всего изолировать 2 разных немаркированных фрагмента html, используя красивый суп для печати в CSV?

Я пытаюсь очистить все названия компаний и адреса электронной почты от this site. Существует три слоя ссылок для прокрутки (список алфавитов с разбивкой по страницам -> Список компаний по букве -> Страница сведений о компании), и я впоследствии распечатал их на csv.

До сих пор я смог изолировать алфавитный список ссылок с помощью кода ниже, но я застреваю при попытке изолировать разные страницы компании, а затем извлекаю имя/адрес электронной почты из немеченого html.

import re 
import urllib2 
from bs4 import BeautifulSoup 

page = urllib2.urlopen('http://www.indiainfoline.com/Markets/Company/A.aspx').read() 
soup = BeautifulSoup(page) 
soup.prettify() 

pattern = re.compile(r'^\/Markets\/Company\/\D\.aspx$') 

all_links = [] 
navigation_links = [] 
root = "http://www.indiainfoline.com/" 

# Finding all links 
for anchor in soup.findAll('a', href=True): 
    all_links.append(anchor['href']) 
# Isolate links matching regex 
for link in all_links: 
    if re.match(pattern, link): 
     navigation_links.append(root + re.match(pattern, link).group(0)) 
navigation_links = list(set(navigation_links)) 

company_pages = [] 
for page in navigation_links: 
    for anchor in soup.findAll('table', id='AlphaQuotes1_Rep_quote')    [0].findAll('a',href=True): 
     company_pages.append(root + anchor['href']) 

ответ

0

По частям. Получение ссылки на каждой отдельной компании легко:

from bs4 import BeautifulSoup 
import requests 

html = requests.get('http://www.indiainfoline.com/Markets/Company/A.aspx').text 
bs = BeautifulSoup(html) 

# find the links to companies 
company_menu = bs.find("div",{'style':'padding-left:5px'}) 
# print all companies links 
companies = company_menu.find_all('a') 
for company in companies: 
    print company['href'] 

Во-вторых, получить названия компаний:

for company in companies: 
    print company.getText().strip() 

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

import re 
# example company page 
html = requests.get('http://www.indiainfoline.com/Markets/Company/Adani-Power-Ltd/533096').text 
EMAIL_REGEX = re.compile("mailto:([A-Za-z0-9.\-+][email protected][A-Za-z0-9_\-]+[.][a-zA-Z]{2,4})") 
re.findall(EMAIL_REGEX, html) 
# and there you got a list of found emails 
... 

Приветствия,

+0

Большое спасибо, это было очень полезно! Я продолжал пытаться вытащить электронные письма, используя номер/порядок таблицы, но это может стать проблемой, если они когда-либо меняют сайт. – user3093445

+0

@ пользователь3093445 добро пожаловать! – PepperoniPizza