Как использовать BeautifulSoup для извлечения html5 элементов, таких как <section> - PullRequest
2 голосов
/ 25 октября 2019

Я намереваюсь извлечь текст статьи из статьи NYT. Однако я не знаю, как извлечь с помощью тегов html5, таких как имя раздела.

import urllib.request
from bs4 import BeautifulSoup

html = urllib.request.urlopen('https://www.nytimes.com/2019/10/24/opinion/chuck-schumer-electric-car.html?action=click&module=Opinion&pgtype=Homepage')
soup = BeautifulSoup(html)
data = soup.findAll(text=True)

Основной текст заключен в раздел с именем articleBody. Какой синтаксис soup.find () можно использовать для его извлечения? enter image description here

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Метод find ищет теги, он не отличает HTML5 от любого другого (X) имени тега HTML

article = soup.find("section",{"name":"articleBody"})
1 голос
/ 25 октября 2019

Вы можете очистить предварительно загруженные данные из тега скрипта и проанализировать библиотеку json. Первый блок кода возвращает немного больше контента, чем вы хотели.

Вы можете еще больше ограничиться, просматривая идентификаторы абзацев внутри тела и используя их для фильтрации содержимого, , как показано в нижнем блоке ;Затем вы получите именно то содержание статьи, которое вы описываете.

import requests, re, json

r = requests.get('https://www.nytimes.com/2019/10/24/opinion/chuck-schumer-electric-car.html?action=click&module=Opinion&pgtype=Homepage')
p = re.compile(r'window\.__preloadedData = (.*})')
data = json.loads(p.findall(r.text)[0])

for k,v in data['initialState'].items():
    if k.startswith('$Article') and 'formats' in v:
        print(v['text@stripHtml'] if 'text@stripHtml' in v else v['text'])

Вы можете изучить json здесь: https://jsoneditoronline.org/?id=f9ae1fb774af439d8e9b32247db9d853


Ниже показано, как использовать дополнительную логику для ограничения довыход вы хотите:

ids = []

for k,v in data['initialState'].items():
    if k.startswith('$Article') and v['__typename'] == 'ParagraphBlock' and 'content' in v:
        ids += [v['content'][0]['id']]

for k,v in data['initialState'].items():
    if k in ids:
        print(v['text'])  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...