Форум сайта python.su
xam1816нет, это типа х-парсера, загружаем в скрипт ключи, скрипт тянет из гугла выдачу по этому ключу и парсит статьи из топа
Вы наверное делаете что-то типа “режим для чтения” который в браузерах,только на python
Офлайн
py.user.nextвоспользовался вашим вариантом
out = list(filter(None, map(str.strip, soup.get_text().splitlines())))
main_tag = soup.find(class_=[re.compile('[Cc]ontent'), 'article', 'main', 'entry']) p_tags_list = main_tag.find_all(['h2', 'h3', 'p', 'ul', 'figure', 'img']) outs = list(filter(None, map(get_text_in_tag, p_tags_list))) def get_text_in_tag(tag): if tag.find('img') is not None: return str(tag.find('img')) elif tag.find('li') is not None: return str(tag.get_text()).strip() else: return str(tag.get_text()).strip()
Офлайн
1. Сначала надо определить, какие данные у тебя на входе.
2. Затем надо определить, какие данные нужно получить на выходе.
3. И после этого нужно описать процедуру получения из данных со входа данных на выходе.
И после этого только надо начинать программировать.
А до этого всего ты, не зная, что получить, пытаешься что-то там получить. А потом ещё и нас вовлекаешь, чтобы мы достали свои волшебные хрустальные шары для гадания и в них разглядывали, что ты там пытаешься получить и из чего.
Задача эта простая, но ты её ставишь неточно, поэтому на неё и уходит столько времени.
Офлайн
ну идею для себя я определил до того, как садиться за код) прошу прощения, если я неявно нарисовал свои цели) цель одна - получить статью с любого(по возможности) статейного сайта, без привязки к конкретной верстке, со всеми разметками(тегами h2-h3-h4, p, ul>li, ol>li) и сохранив в тексте теги картинок вида <img src=“//pic.jpg” title=“”/>. т.е. изначально неизвестно, какие теги содержатся в исходном коде страницы, но теги h2, h3, h4, p, ul>li, ol>li есть априори. понимаю, что невозможно сделать универсальный, покрывающий 100% сайтов, парсер, но надеюсь, что для 70-80% сайтов такой скрипт сделать можно.
Офлайн
robishoА “статья” - это что? Как ты понимаешь, что является статьёй, а что не является статьёй?
цель одна - получить статью с любого(по возможности) статейного сайта, без привязки к конкретной верстке, со всеми разметками(тегами h2-h3-h4, p, ul>li, ol>li) и сохранив в тексте теги картинок вида <img src=“//pic.jpg” title=“”/>.
<article>
<h2>text</h2>
<p>text</p>
<p><img src="pics.jpg"></p>
<h2>text</h2>
<p>text
<ul>
<li>
text
</li>
text
<li>
text
</li>
</ul>
</p>
<h2>text</h2>
<p>text</p>
</article>
Отредактировано py.user.next (Дек. 12, 2020 23:09:00)
Офлайн
py.user.nextспасибо, что увидели такую глубину в моей идее) не, без шуток, спасибо, я так глубоко и не думал копать. была простая утилитарная задумка для сео задач. вы хорошо описали направление движения. на самом деле на начальном этапе я тоже думал об этом, даже на xpath составил болванку тегов, с которых начинаются многие статьи
tags1 = tree.xpath("//*[starts-with(@class, 'entry')]/descendant-or-self::node()") tags2 = tree.xpath("//div[starts-with(@class, 'content')]/descendant-or-self::node()") tags3 = tree.xpath("//*[contains(@id, 'content')]/descendant-or-self::node()") tags4 = tree.xpath('//h1/parent::*/descendant-or-self::node()')
Так что на данном этапе можешь только определить вид статьи и применить к ней алгоритм разбора, соответствующий этому виду статьи, и сделать такие пары <распознаватель, разбиратель> для всех статей, которые тебе встречались.подтвердила мою изначальную, поэтому будем разбираться дальше)
Офлайн
robishoЗдесь их четыре, а вообще их бесконечное множество. Поэтому нужно определить (создать) тип статьи. Статья - это …
даже на xpath составил болванку тегов
>>> def get_text_type(text): ... out = 'undefined' ... if text.startswith('<article>'): ... out = 'article' ... elif text.startswith('<div>'): ... out = 'div' ... return out ... >>> def parse_article(text, article_type): ... out = None ... if article_type == 'article': ... out = parse_article_article(text) ... elif article_type == 'div': ... out = parse_article_div(text) ... return out ... >>> def parse_article_article(text): ... out = {'title': text.split('\n')[0][9:], 'content': text.split('\n')[1]} ... return out ... >>> def parse_article_div(text): ... out = {'title': text.split('\n')[0][5:], 'content': text.split('\n')[1]} ... return out ... >>> def process_text(text): ... text_type = get_text_type(text) ... if text_type != 'undefined': ... article = parse_article(text, text_type) ... print('{}\n {}'.format(article['title'], article['content'])) ... else: ... print('It is not an article.') ... >>> process_text('article\ncontent of article') It is not an article. >>> process_text('<article>Article\nContent of Article') Article Content of Article >>> process_text('div\ncontent of div') It is not an article. >>> process_text('<div>Div\nContent of Div') Div Content of Div >>>
Отредактировано py.user.next (Дек. 13, 2020 07:11:59)
Офлайн
Добрый день. получилась такая вот поделка)
tag1 = soup.find('article') tag2 = soup.find('section') tag3 = soup.find('div', itemtype='http://schema.org/Article') tag4 = soup.find_all('div', class_=re.compile('[Cc]ontent')) tag5 = soup.find_all('div', class_=re.compile('entry')) tag6 = soup.find('div', id='content') tag7 = soup.find_all('div', class_=re.compile('container')) if tag1: if tag1.has_attr('itemtype') or tag1.find('p'): article_tag = tag1 elif tag2 and tag2.find('p'): article_tag = tag2 elif tag3 and tag3.find('p'): article_tag = tag3 elif tag4: for tag in tag4: if len(tag.find_all('p')) > 3: article_tag = tag elif tag5: for tag in tag5: if len(tag.find_all('p')) > 3: article_tag = tag elif tag6 and tag6.find('p'): article_tag = tag6 elif tag7: for tag in tag7: if len(tag.find_all('p')) > 3: article_tag = tag try: article_tags_list = article_tag.find_all(['h2', 'h3', 'h4', 'p', 'ul', 'ol', 'figure']) print(article_tag.name, article_tag.attrs) except: print('Тег статьи не определен!')
Офлайн
исправил, вроде так норм
tag1 = soup.find('article') tag2 = soup.find_all('section') tag3 = soup.find_all('div', itemtype='http://schema.org/Article') tag4 = soup.find_all('div', class_=re.compile('[Cc]ontent')) tag5 = soup.find_all('div', class_=re.compile('entry')) tag6 = soup.find_all('div', id='content') tag7 = soup.find_all('div', class_=re.compile('container')) tags_list = [] tags_list.append(tag2) tags_list.append(tag3) tags_list.append(tag4) tags_list.append(tag5) tags_list.append(tag6) tags_list.append(tag7) if tag1: if len(tag1.find_all('p')) > 3 or tag1.has_attr(itemtype='http://schema.org/Article'): article_tag = tag1 else: for tags in tags_list: if tags: for tag in tags: if len(tag.find_all('p')) > 3: article_tag = tag
Отредактировано robisho (Дек. 16, 2020 16:18:35)
Офлайн
добрый день. помогите, пожалуйста, понять, где я ошибаюсь
сайт sympaty.net/20160613/chto-delat-posle-solyariya/
tags_list = soup.find_all('div') print('tags_list ', len(tags_list)) # 116 тегов for tag in tags_list: if len(tag.find_all('p')) > 5: article_tag = tag
Офлайн