Я пытаюсь напечатать содержание новостной статьи, используя BeautifulSoup4.

URL-адрес: Ссылка

Текущий код, который у меня есть, выглядит следующим образом, который дает желаемый результат:

page = requests.get('http://www.thehindu.com/news/national/People-showing-monumental-patience-queuing-up-for-a-better-India-says-Venkaiah/article16447029.ece')
soup = BeautifulSoup(page.content, 'html.parser')


article_text = ""
table = soup.find_all("div",{ "id": "content-body-14266949-16447029"})                              

for element in table:
    article_text += ''.join(element.find_all(text = True)) + "\n\n"

print(article_text)

Однако проблема в том, что я хочу очистить несколько страниц, и каждая из них имеет свой номер тела содержимого в формате xxxxxxxx-xxxxxxxx (2 блока по 8 цифр).

Я попытался заменить команду soup.find_all на регулярное выражение как:

table = soup.find_all (text = re.compile ("content-body -........-........"))

Но это дает ошибку:

AttributeError: у объекта 'NavigableString' нет атрибута 'find_all'

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

Спасибо.

1
Gokul 29 Авг 2017 в 07:19

3 ответа

Лучший ответ

Регулярные выражения должны быть в порядке! Пытаться

table = soup.find_all("div",{ "id": re.compile('content-body-*')})
2
Robbie Jones 29 Авг 2017 в 05:22

Другой подход может быть с селектором CSS. Селекторы чистые и по сути. Вы также можете попробовать. Просто измените "URL" с вашей ссылкой.

import requests ; from bs4 import BeautifulSoup

res = requests.get(url).text
soup = BeautifulSoup(res,"html.parser")

for item in soup.select("div[id^=content-body-] p"):
    print(item.text)
1
SIM 29 Авг 2017 в 06:08

Вы можете использовать извлечение содержимого с помощью библиотеки lxml. lxml позволяет использовать xpath для извлечения содержимого из html.

from lxml import etree
selector=etree.HTML(pageText)
article_text=selector.xpath('//div[@class="article-block-multiple live-snippet"]/div[1]')[0].text

Я не использую BeautifulSoup. Я думаю, что вы можете использовать BeautifulSoup, как это

table = soup.find_all("div",{ "class": "article-block-multiple live-snippet"]"})

Затем используйте find child element, найдите первый элемент div

2
Sun Yi 29 Авг 2017 в 04:51