Получите HTML-элемент, основанный на элементе ранее, с Beautiful Soup (веб-сайт EPA) - PullRequest
0 голосов
/ 29 октября 2018

Я бы хотел напечатать раздел "Гражданский штраф" в населенных пунктах EPA, например https://www.epa.gov/enforcement/chevron-settlement-information-sheet или https://www.epa.gov/enforcement/ngl-crude-logistics-llc-clean-air-act-settlement

Из следующего источника HTML

<h2 id="civil">Civil Penalty</h2>
<p>Chevron U.S.A. will pay a $2.95 million civil penalty, of which $2,492,750 will be paid to the United States and $457,250 to the State of Mississippi.</p>

Я хотел бы получить Шеврон США заплатит гражданский штраф в размере 2,95 миллиона долларов ...

Эта структура одинакова для всех расчетных ведомостей.

<h2 id="civil">Civil Penalty</h2>
<p>NGL will pay a civil penalty of $25 million. The penalty is based, in part, on the company’s limited ability to pay a larger penalty.</p>

Я нашел сходство с Получить элемент перед строкой с Beautiful Soup - но это не полностью идентично моему вопросу.

Вот мой скелет кода:

import requests
from bs4 import BeautifulSoup
import sys

for i in ['chevron-settlement-information-sheet', 'ngl-crude-logistics-llc-clean-air-act-settlement', 'derive-systems-clean-air-act-settlement']:

    page = requests.get("https://www.epa.gov/enforcement/"+i)
    soup = BeautifulSoup(page.content, 'html.parser')

    data = []

    for result in soup.find_all('h2', id='civil'):
        data.append(result)

print(data)

Как можно распечатать раздел <p> непосредственно после <h2 id="civil">?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Одна из причин, по которой вы, возможно, не получили результаты, которые вы искали, заключается в том, что вы добавляете /history к URL-адресу, что приводит к ошибке 404 . Если вы удалите эту часть и затем используете findNext('p'), чтобы получить следующий элемент абзаца на странице после элемента <h2 id="civil">, вы получите ожидаемый результат:

import requests
from bs4 import BeautifulSoup

for url in ['chevron-settlement-information-sheet', 'ngl-crude-logistics-llc-clean-air-act-settlement', 'derive-systems-clean-air-act-settlement']:

    page = requests.get("https://www.epa.gov/enforcement/" + url)
    soup = BeautifulSoup(page.content, 'html.parser')

    result = soup.find('h2', {'id': 'civil'}).findNext('p')
    print(result.text)

Это распечатывает:

Chevron U.S.A. will pay a $2.95 million civil penalty, of which $2,492,750 will be paid to the United States and $457,250 to the State of Mississippi.
NGL will pay a civil penalty of $25 million. The penalty is based, in part, on the company’s limited ability to pay a larger penalty.
Derive will pay a civil penalty of $300,000, as the company has limited financial ability to pay a higher penalty. 
0 голосов
/ 29 октября 2018

Вы можете попробовать селектор брата, +.

p=soup.select('#civil + p')
print(p[0].getText())

Это выберет только элемент p, который является ближайшим родственником элемента #civil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...