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

В предисловии скажу, что я новичок в Python, и я впервые использую BeautifulSoup. Любой вклад приветствуется.

Я пытаюсь извлечь все названия компаний и адреса электронной почты с этого сайта. Есть 3 уровня ссылок для обхода (список страниц в алфавитном порядке -> список компаний по буквам -> страница сведений о компании), и я впоследствии распечатаю их в 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'])

person user3093445    schedule 12.12.2013    source источник


Ответы (1)


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

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.\-+]+@[A-Za-z0-9_\-]+[.][a-zA-Z]{2,4})")
re.findall(EMAIL_REGEX, html)
# and there you got a list of found emails
...

Ваше здоровье,

person PepperoniPizza    schedule 12.12.2013
comment
Большое спасибо, это было очень полезно! Я продолжал пытаться получить электронные письма, используя номер/порядок стола, но это могло стать проблемой, если они когда-нибудь изменят сайт. - person user3093445; 12.12.2013