Форум сайта python.su
Добрый день. Python3.8+win7+requests+BeautifulSoup
При парсинге страницы имеем такую архитектуру:
<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>
article_tags = soup.find_all('p') article = '' for tag in article_tags: try: if tag.find('img') is not None: article += str(tag.find('img')) + '\n' article += tag.text + '\n' except Exception as e: continue
Отредактировано robisho (Дек. 8, 2020 12:06:17)
Офлайн
какой адрес страницы?
Офлайн
xam1816да адрес в данном случае не важен, это парсер статей из гугла по ключу, сайты разные и разметка у них тоже разная, к тегу article/main/content/etc не привяжешься.
какой адрес страницы?
Офлайн
robishoПронумеруй все тексты в исходном XML-коде.
При парсинге страницы имеем такую архитектуру:
robishoВот для этого и пронумеруй тексты типа text1, text2 и так далее, чтобы видеть, где дубли, а где не дубли, пока алгоритм реализуешь на экспериментальных вводных данных.
и еще присутствуют иногда дубли кусков текста
Отредактировано py.user.next (Дек. 8, 2020 17:15:50)
Офлайн
py.user.nextну я же сознательно ищу теги р и не ищу теги article) тело статьи почти со 100% вероятностью будет в тегах p, а вместо тега article может быть div, или div, или … да дофига этих стилей в современном многоборье)))
article_tags = soup.find_all(['h2', 'h3', 'h4', 'p', 'li'])
Офлайн
robisho<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>
robishoНо теги p не содержат тегов h1, h2 и так далее. Поэтому когда ты ищёшь теги p, а потом ищешь в каждом из тегов p теги h1, h2 и подобные
ну я же сознательно ищу теги р и не ищу теги article)
robishoто, естественно, ты их там не находишь, потому что их там нет, так как они находятся в теге article.article_tags = soup.find_all('p') article = '' for tag in article_tags: ...
>>> import bs4 >>> >>> text = """ ... <article> ... <h2>text1</h2> ... <p>text2</p> ... <p><img src="pics.jpg"></p> ... <h2>text3</h2> ... <p>text4 ... <ul> ... <li> ... text5 ... </li> ... text6 ... <li> ... text7 ... </li> ... </ul> ... </p> ... <h2>text8</h2> ... <p>text9</p> ... </article> ... """ >>> >>> soup = bs4.BeautifulSoup(text, 'lxml') >>> out = list(filter(None, map(str.strip, soup.get_text().splitlines()))) >>> out ['text1', 'text2', 'text3', 'text4', 'text5', 'text6', 'text7', 'text8', 'text9'] >>>
Отредактировано py.user.next (Дек. 9, 2020 06:54:32)
Офлайн
py.user.nextда я прекрасно понимаю, что в теге p нет тегов h2-h3) эти теги обычно одноуровневые с тегом p, поэтому пробовал у p.parent пройти все next_siblings, h2-h3 ловлю, а ul>li нет…
article_tags = soup.find_all(['h2', 'h3', 'h4', 'p', 'li'])
Отредактировано robisho (Дек. 9, 2020 06:47:10)
Офлайн
robishoНу, как надоест мучиться, тогда придёшь и расскажешь всё. Может, тебе xam1816 решит эту задачу. А если уж совсем тяжело будет, тогда и я подтянусь.
ищу возможность оставить li и h3-h4, которые относятся только к p, а то тянется все и с меню, и с сайдбара.
Отредактировано py.user.next (Дек. 9, 2020 07:05:44)
Офлайн
ну если кому интересно, остановился на таком варианте
p_tags_list = soup.find_all(['h2', 'h3', 'p', 'ul', 'figure', 'img']) # отобрал теги, что всегда используются в статьях p_tags = [] # убрал те, что с атрибутами, они в подавляющем большинстве случаев не относятся к статье for tag in p_tags_list: if not tag.attrs: p_tags.append(tag) article = '' for t in p_tags: try: if t.find('img') is not None: article += '\n' + str(t.find('img')) + '\n' elif t.find('li') is not None: article += '\n' + t.text + '\n' elif t.find('h4') is not None: article += '\n' + t.text + '\n' else: article += '\n' + t.text + '\n' ' except Exception as e: continue
Отредактировано robisho (Дек. 11, 2020 14:50:20)
Офлайн
Вы наверное делаете что-то типа “режим для чтения” который в браузерах,только на python
Офлайн