2012-05-15 2 views
0

Я пытаюсь написать программу, которая читает статьи (сообщения) любого веб-сайта, который может варьироваться от Blogspot или блогов Wordpress/любого другого веб-сайта. Что касается написания кода, который совместим практически со всеми сайтами, которые могли быть написаны в HTML5/XHTML и т. Д. Я думал об использовании RSS/Atom-каналов в качестве основы для извлечения контента.Как читать содержимое веб-сайта в python

Однако, поскольку RSS/Atom-каналы обычно не содержат целых статей веб-сайтов, я решил собрать все ссылки «сообщения» из фида, используя feedparser, а затем хочу извлечь содержимое статьи из соответствующего URL-адреса.

Я мог бы получить URL всех статей на веб-сайте (включая сводку, т. Е. Содержимое статьи, показанную в фиде), но я хочу получить доступ ко всем данным статьи, для которых я должен использовать соответствующий URL-адрес.

Я столкнулся с различными библиотеками, такими как BeautifulSoup, lxml и т. Д. (Различные анализаторы HTML/XML), но я действительно не знаю, как получить «точный» контент статьи (я предполагаю, что «точный» означает данные со всеми гиперссылками, iframes, показ слайдов и т. д., я не хочу, чтобы часть CSS).

Итак, может ли кто-нибудь мне помочь?

+0

Что вы пробовали? Вы хотите HTML, изображения и все файлы сайта или просто хотите захватить части HTML? Пожалуйста, будьте более конкретными. – serk

+0

@serk рассматривает сообщение в блоге, я хочу, чтобы информация была точно такой, как она была написана. (сохранить CSS). – Surya

+0

Почему бы не попробовать 'wget' тогда? – serk

ответ

2

Получение кода HTML всех связанных страниц довольно просто.

Жесткая часть - извлечь именно то, что вы ищете. Если вам просто нужен весь код внутри тега <body>, это тоже не должно быть большой проблемой; извлечение всего текста одинаково прост. Но если вы хотите более конкретное подмножество, у вас больше работы.

Предлагаю вам загрузить запросы и модуль BeautifulSoup (оба доступны через easy_install requests/bs4 или лучше pip install requests/bs4). Модуль запросов упрощает выборку вашей страницы.

Следующий пример выбирает канал RSS и возвращает три списка:

  • linksoups является списком BeautifulSoup экземпляров каждой страницы, связанной с подачей
  • linktexts является список видимого текста каждой страницы, связанной с фида
  • linkimageurls - это список списков с src -urls всех изображений, встроенных в каждую страницу, связанную с фидом
    • например. [['/pageone/img1.jpg', '/pageone/img2.png'], ['/pagetwo/img1.gif', 'logo.bmp']]
import requests, bs4 

# request the content of the feed an create a BeautifulSoup object from its content 
response = requests.get('http://rss.slashdot.org/Slashdot/slashdot') 
responsesoup = bs4.BeautifulSoup(response.text) 

linksoups = [] 
linktexts = [] 
linkimageurls = [] 

# iterate over all <link>…</link> tags and fill three lists: one with the soups of the 
# linked pages, one with all their visible text and one with the urls of all embedded 
# images 
for link in responsesoup.find_all('link'): 
    url = link.text 
    linkresponse = requests.get(url) # add support for relative urls with urlparse 
    soup = bs4.BeautifulSoup(linkresponse.text) 
    linksoups.append(soup) 

    linktexts.append(soup.find('body').text) 
    # Append all text between tags inside of the body tag to the second list 

    images = soup.find_all('img') 
    imageurls = [] 
    # get the src attribute of each <img> tag and append it to imageurls 
    for image in images: 
     imageurls.append(image['src']) 
    linkimageurls.append(imageurls) 

# now somehow merge the retrieved information. 

Это может быть грубой отправной точкой для вашего проекта.

+0

Почему вы использовали 'запросы'? – Surya

+1

Я просто думаю, что это намного удобнее и практичнее, чем urllib, urllib2 или urllib3. Возможно, вы захотите ознакомиться с [документацией] (http://docs.python-requests.org/en/latest/). Уверяю вас, это очень красиво и pythonic :) Это также можно сделать с одной из стандартных библиотек; это больше похоже на личное предпочтение. – camelNeck

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