2016-02-15 22 views
5

Lütfen benimle. Python'da oldukça yeniyim, ama çok eğleniyorum. Danimarka'daki son referandumdan seçim sonuçlarını tarayan bir web tarayıcısını kodlamaya çalışıyorum. Tüm ilgili linkleri ana sayfadan çıkarmayı başardım. Ve şimdi Python'un 92 bağlantıdan her birini takip etmesini ve bu sayfaların her birinden 9 adet bilgi toplamasını istiyorum. Ama çok takıldım. Umarım bana bir ipucu verebilirsin.Web tarayıcı - takip eden linkler

import requests 
import urllib2 
from bs4 import BeautifulSoup 

# This is the original url http://www.kmdvalg.dk/ 

soup = BeautifulSoup(urllib2.urlopen('http://www.kmdvalg.dk/').read()) 

my_list = [] 
all_links = soup.find_all("a") 

for link in all_links: 
    link2 = link["href"] 
    my_list.append(link2) 

for i in my_list[1:93]: 
    print i 

# The output shows all the links that I would like to follow and gather information from. How do I do that? 
+0

Her bağlantıda ele geçirmek istediğiniz 9 parça hakkında daha fazla bilgi verebilir misiniz? – titipata

+0

Vay - siz çocuklar awsome! Çözümlerinizi anlamaya çalışmak için biraz zaman harcamak zorunda kalacağım. Onları anladığım anda geri döneceğim. ÇOK TEŞEKKÜRLER! – Metods

+0

@titipat: Evet. Bu alt siteye bir göz atın. "Oylayabilecek kişi/kişi sayısı", "Optalte stemmer/sayım oyu", "JA-stemmer/evet oyu veren insanlar", "NEJ-stemmer/hayır oyu veren insanlar", "Blanke stemmer/blank" oy "," Ugyldige stemmer/Geçersiz oy "ve belediyenin adı (bu durumda Assenskredsen) – Metods

cevap

4

Basit bir yaklaşım URL'lerin listenizde yineleme ve bunları tek tek her ayrıştırmak olacaktır.

from requests_futures.sessions import FuturesSession 

def my_parse_function(html): 
    """Use this function to parse each page""" 
    soup = BeautifulSoup(html) 
    all_paragraphs = soup.find_all('p') 
    return all_paragraphs 

session = FuturesSession(max_workers=5) 
futures = [session.get(url) for url in my_list] 

page_results = [my_parse_function(future.result()) for future in results] 
+0

Bu çok harika. Komut dizim artık URL'ler listemde yinelenen yorumunuz sayesinde çalışıyor. – Metods

+0

UPS - yapılmadı. Bu sayfadaki diğer tüm önerilerin daha havalı olduğuna eminim - ama anlayabileceğim tavsiye huzurunu seçiyorum. Teşekkürler. Bu benim son kod çalışır - Eğer daha akıllı hale getirmek için önerileriniz varsa lütfen bana bildirin. Yöntemlerden Saygılarımızla. – Metods

5

İşte lxml kullanarak çözüm:

İşte benim kodudur. Bu BeautifulSoup

import lxml 
from lxml import html 
import requests 

page = requests.get('http://www.kmdvalg.dk/main') 
tree = html.fromstring(page.content) 
my_list = tree.xpath('//div[@class="LetterGroup"]//a/@href') # grab all link 
print 'Length of all links = ', len(my_list) 

my_list benzeyen bir liste tüm bağlantıların oluşmaktadır. Ve şimdi her sayfanın içindeki bilgileri kazımak için döngü için kullanabilirsiniz.

Her bağlantıda geçiş yapabiliriz. Her sayfada, örnek olarak bilgi alabilirsiniz. Bu sadece en üstteki masa içindir.

sayfa aşağıdaki tabloda için
table_information = [] 
for t in my_list: 
    page_detail = requests.get(t) 
    tree = html.fromstring(page_detail.content) 
    table_key = tree.xpath('//td[@class="statusHeader"]/text()') 
    table_value = tree.xpath('//td[@class="statusText"]/text()') + tree.xpath('//td[@class="statusText"]/a/text()') 
    table_information.append(zip([t]*len(table_key), table_key, table_value)) 

,

table_information_below = [] 
for t in my_list: 
    page_detail = requests.get(t) 
    tree = html.fromstring(page_detail.content) 
    l1 = tree.xpath('//tr[@class="tableRowPrimary"]/td[@class="StemmerNu"]/text()') 
    l2 = tree.xpath('//tr[@class="tableRowSecondary"]/td[@class="StemmerNu"]/text()') 
    table_information_below.append([t]+l1+l2) 

Umut bu yardım!

for url in my_list: 
    soup = BeautifulSoup(urllib2.urlopen(url).read()) 
    # then parse each page individually here 

Alternatif olarak, önemli ölçüde Futures kullanarak hızlandırmak olabilir:

2

Bu ben sadece tablodan basit eleman almak ... sorununuza

import requests 
from bs4 import BeautifulSoup 


def spider(): 
    url = "http://www.kmdvalg.dk/main" 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text, 'html.parser') 

    for link in soup.findAll('div', {'class': 'LetterGroup'}): 
     anc = link.find('a') 
     href = anc.get('href') 

     print(anc.getText()) 
     print(href) 
     # spider2(href) call a second function from here that is similar to this one(making url = to herf) 
     spider2(href) 
     print("\n") 


def spider2(linktofollow): 
    url = linktofollow 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text, 'html.parser') 

    for link in soup.findAll('tr', {'class': 'tableRowPrimary'}): 
     anc = link.find('td') 

     print(anc.getText()) 
    print("\n") 


spider() 

onun yapmadı benim çözüm olurdu ama fikir olsun ve nasıl çalıştığını sözde.

+0

bulmak yerine ('td') ikinci fucntionda bulmak istediğiniz td sınıfının adını kullanarak findAll kullanabilirsiniz. – CVasquezG

1

İşte düzgün çalışan son kodum. Eğer daha akıllı yapabilirsem lütfen bana haber ver!

import urllib2 
from bs4 import BeautifulSoup 
import codecs 

f = codecs.open("eu2015valg.txt", "w", encoding="iso-8859-1") 

soup = BeautifulSoup(urllib2.urlopen('http://www.kmdvalg.dk/').read()) 

liste = [] 

alle_links = soup.find_all("a") 

for link in alle_links: 
    link2 = link["href"] 
    liste.append(link2) 

for url in liste[1:93]: 
    soup = BeautifulSoup(urllib2.urlopen(url).read().decode('iso-8859-1')) 
    tds = soup.findAll('td') 
    stemmernu = soup.findAll('td', class_='StemmerNu') 
    print >> f, tds[5].string,";",tds[12].string,";",tds[14].string,";",tds[16].string,";", stemmernu[0].string,";",stemmernu[1].string,";",stemmernu[2].string,";",stemmernu[3].string,";",stemmernu[6].string,";",stemmernu[8].string,";",'\r\n' 

f.close() 
İlgili konular