2017-02-06 7 views
0

Я использую beautifulsoup, чтобы извлечь ссылки href со страницы url, а затем добавить имя URL-адреса и извлеченные ссылки для создания списка в списке. Например, для каждого URL, я хочу, чтобы получить доступ к странице и извлекать адреса в ссылку, а затем добавить в список в списке, чтобы создать:Как добавить два разных элемента в список

[['www.example.com', 'www.example.com/extractedlink1', 'www.example.com/extractedlink2'],['www.apple.com', 'www.apple.com/exractedlink1']...] 

Та часть меня возникают проблемы в Добавляя два элемента в списке в списке. Ниже url_list список с URL, чтобы получить доступ к добыче бывших) ['www.example.com', 'www.apple.com'....]

url_and_extracted = [] 

for i in range(0,len(url_list)): 
    url = url_list[i] 
    driver = webdriver.PhantomJS() 
    driver.get(url) 
    time.sleep(2) 
    html = driver.page_source 
    driver.close() 
    soup = BeautifulSoup(html, "html.parser") 
    for div in soup.find_all("div", attrs={"class" : "article-content entry-content"}): 
     url_and_extracted.append([url_list[i],str(div.find("a")['href'])]) 

Но я не думаю, что последняя часть прав, это привело бы к нескольким спискам с тем же самым оригинальным URL, когда есть более одной ссылки, извлеченной из одного URL-адреса. То, что я хочу, это один список в списке с оригинальным url и извлеченными hrefs.

ответ

0

Как о простом подходе сбора ссылок, затем добавить URL, прежде чем добавить его в основной список:

url_and_extracted = [] 
driver = webdriver.PhantomJS() 

for url in url_list: 
    links = [] # collect the links here 
    driver.get(url) 
    time.sleep(2) 
    html = driver.page_source 
    soup = BeautifulSoup(html, "html.parser") 
    for div in soup.find_all("div", attrs={"class" : "article-content entry-content"}): 
     links.append(div.find("a")['href']) 

    url_and_extracted.append([url]+links) # add the url with [url] + links 
             # to the main list. 
0

использования dict на карту отношения URLs:

{'www.example.com': ['www.example.com/extractedlink1', 'www.example.com/extractedlink2']} 

причина, почему вы код не работает эта часть:

for div in soup.find_all("div", attrs={"class" : "article-content entry-content"}): 
     url_and_extracted.append([url_list[i],str(div.find("a")['href'])]) 

вы должны приложить к url_and_extracted в каждом iterration из i, а не div.

код:

from collections import defaultdict 
url_and_extracted = [] 
# for i in range(0,len(url_list)): 
for i in in url_list: 
    d = defaultdict(list) 
    driver = webdriver.PhantomJS() 
    driver.get(url) 
    time.sleep(2) 
    html = driver.page_source 
    driver.close() 
    soup = BeautifulSoup(html, "html.parser") 
    for div in soup.find_all("div", attrs={"class" : "article-content entry-content"}): 
     d[i].append(div.find("a")['href']) 
    url_and_extracted.append(d) 
+0

В этом случае, вы не вам нужно оригинальное 'url_and_extracted' вообще. –

+0

@BurhanKhalid Я запустил код, он сработал, но результат довольно странный, это форма словаря, но есть «defaultdict (», вставленный между каждым элементом словаря. – song0089

+0

Итак? Не смотрите, как что-то печатается - это просто представление данных. –

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