2013-12-05 2 views
0

У меня есть простая программа python, которая ищет ключевое слово внутри URL-адреса и возвращает true или false. Я хочу изменить его, поэтому я просматриваю только эту статью, а не заголовок, а не другие вещи вокруг веб-страницы или рекламы или других статей и т. Д. У меня есть сотни URL-адресов для проверки, и они не имеют одинакового стиля (i думаю, не проверили их все, кроме своего рода очевидным). Как я могу сделать что-то подобное, если это возможно? Первый раз с использованием BeautifulSoup.Получить текст из статьи BeautifulSoup

Вот что я использую сейчас

import re 
import sys 
from BeautifulSoup import BeautifulSoup 
import urllib2 

#argecho.py 

content = urllib2.open(sys.argv[1]).read() 

print sys.argv[2] in content # -> True 

Я посылаю URL и ключевое слово в качестве аргументов, как у меня есть еще один сценарий, призывающую это сотни адресов.

+0

Я думаю, что mbowden's right - вам нужно будет больше сказать о структуре веб-сайтов, которые вы хотите проанализировать. Все ли соответствующие данные, которые вы хотите отсканировать для своего ключевого слова в определенном типе тега? Есть ли что-то, что делит соответствующие данные от нерелевантных метаданных (например, заголовок статьи)? – duhaime

+0

Я удалил свой комментарий, чтобы переосмыслить. Каждая структура будет отличаться. BeautifulSoup сломает веб-страницу по тегам для вас. Но вам нужно знать, чего вы хотите. Если это ссылки, изображения или абзацы, это просто, иначе ... – mbowden

ответ

2

Нет простого способа извлечь статью с веб-страницы. Вы можете использовать некоторые внешние услуги, который извлекает содержимое как Readability и python library для него

2

BeautifulSoup, сами по себе, не в состоянии извлечь текст из «статей», так как, что и статья является, HTML-мудрым, полностью субъективен , и будет изменяться с одного сайта на другой. Вам нужно написать другой парсер для каждого сайта.

Мое предложение заключается в моделировании это с помощью наследования:

class Webpage(object): 
    def __init__(self, html_string): 
     self.html= BeautifulSoup(html_string) 
    def getArticleText(self): 
     raise NotImplemented 

class NewYorkTimesPage(Webpage): 
    def getArticleText(self): 
     return self.html.find(...) 
1

Вы можете искать текст в только текст тела с BeautifulSoup, путем преобразования sys.argv[2] в регулярное выражение:

import sys 
from bs4 import BeautifulSoup 
import urllib2 
import re 

response = urllib2.urlopen(sys.argv[1]) 
soup = BeautifulSoup(response.read(), from_encoding=response.info().getparam('charset')) 
text_pattern = re.compile(re.escape(sys.argv[2])) 

if soup.find('body').find(text=text_pattern): 
    print 'Found the text in the page') 

Однако, чтобы сузить это, чтобы исключить навигацию, нижние колонтитулы и т. Д., Вам нужно применить некоторые эвристики. Каждый сайт отличается и определяет, какая часть страницы составляет основной текст, не является простой задачей.

Вместо того, чтобы повторно изобретать это колесо, вместо этого вы можете посмотреть на Readability API; они уже создали большую библиотеку эвристики, чтобы разобрать «главную» часть сайта для вас.

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