2017-12-01 2 views
2

링크에서 두 개의 목록을 작성하려고합니다. 하나는 국가 용이고 다른 하나는 통화 용입니다. 그러나, 나는 그것이 단지 나에게 첫 번째 국가 이름을 주지만 모든 국가의 목록을 반복하지는 않는 어떤 지점에 갇혀있다. 이 문제를 해결할 수있는 방법에 대한 도움을 주시면 감사하겠습니다. 미리 감사드립니다.웹 스크 레이 핑에서 목록을 반복하지 않음

from bs4 import BeautifulSoup 
import urllib.request 

url = "http://www.worldatlas.com/aatlas/infopage/currency.htm" 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 
10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 
Safari/537.36'} 

req = urllib.request.Request(url, headers=headers) 
resp = urllib.request.urlopen(req) 
html = resp.read() 

soup = BeautifulSoup(html, "html.parser") 
attr = {"class" : "miscTxt"} 

countries = soup.find_all("div", attrs=attr) 
countries_list = [tr.td.string for tr in countries] 

for country in countries_list: 
    print(country) 
+0

'countries_list'를 출력하여 두 개 이상의 항목이 포함되어 있는지 확인 했습니까? – MrT

+0

예, 했어요. 목록에있는 첫 번째 국가 만 인쇄합니다. – user8838477

+0

방금 ​​countries_list를 확인한 결과 'Afghanistan' 만 포함되었습니다. 그것은 반복이 아니며, 문제는'[국가에서 tr에 대한 문자열]' – MrT

답변

0

이 스크립트를 시도해보십시오

여기 내 시도이다. 해당 통화와 함께 국가 이름을 제공해야합니다. 이 사이트에 헤더를 사용할 필요가 없습니다.

from bs4 import BeautifulSoup 
import urllib.request 

url = "http://www.worldatlas.com/aatlas/infopage/currency.htm" 
resp = urllib.request.urlopen(urllib.request.Request(url)).read() 
soup = BeautifulSoup(resp, "lxml") 

for item in soup.select("table tr"): 
    try: 
     country = item.select("td")[0].text.strip() 
    except IndexError: 
     country = "" 
    try: 
     currency = item.select("td")[0].find_next_sibling().text.strip() 
    except IndexError: 
     currency = "" 
    print(country,currency) 

부분 출력 :

Afghanistan afghani 
Algeria dinar 
Andorra euro 
Argentina peso 
Australia dollar 
+0

입니다. 정말 고마워 – user8838477

1

또한 다음 map & zip으로이 개 목록에 튜플을 변환 [(country, currency)] & 같은 튜플의 목록을 만들기 위해 하나의 이해 목록을 사용할 수 있습니다

temp_list = [ 
    (t[0].text.strip(), t[1].text.strip()) 
    for t in (t.find_all('td') for t in countries[0].find_all('tr')) 
    if t 
] 

countries_list, currency_list = map(list,zip(*temp_list)) 

전체 코드 :

from bs4 import BeautifulSoup 
import urllib.request 

req = urllib.request.Request("http://www.worldatlas.com/aatlas/infopage/currency.htm") 

soup = BeautifulSoup(urllib.request.urlopen(req).read(), "html.parser") 

countries = soup.find_all("div", attrs = {"class" : "miscTxt"}) 

temp_list = [ 
    (t[0].text.strip(), t[1].text.strip()) 
    for t in (t.find_all('td') for t in countries[0].find_all('tr')) 
    if t 
] 

countries_list, currency_list = map(list,zip(*temp_list)) 

print(countries_list) 
print(currency_list)