Как отобразить заголовок и абзац заголовка в том же порядке, что и исходная веб-страница? - Python - PullRequest
0 голосов
/ 30 апреля 2020

Я - парсер веб-страницы Википедии. Я хочу выполнить поиск по ключевому слову, например «Первая абстракция», и показать заголовок, заголовок и абзац, где оно соответствует: «Как я могу это сделать?».

Web :https://en.wikipedia.org/wiki/Mathematics
Search = "The first abstraction"
Output :
       tittle: Mathematics
       header: History
       paragraph : The history of mathematics can be seen as an ever-increasing series of   
                   abstractions. **The first abstraction**, which is shared by many animals,[14] was 
                   probably that of numbers: the realization that a collection of two apples and a            
                   collection of two oranges (for example) have something in common, namely quantity 
                   of their members. 
import bs4
import requests

response = requests.get("https://en.wikipedia.org/wiki/Mathematics")

if response is not None:
html = bs4.BeautifulSoup(response.text, 'html.parser')

title = html.select("#firstHeading")[0].text
print(title)
paragraphs = html.select("p")
for para in paragraphs:
    print (para.text)

# just grab the text up to contents as stated in question
intro = '\n'.join([ para.text for para in paragraphs[0:5]])
print (para.text)

Этот код хорошо показывает заголовок, но заголовок и абзац не упорядочены, и тогда я не могу сопоставить его. Thx

1 Ответ

1 голос
/ 30 апреля 2020

Во-первых, вам нужно искать «Первую абстракцию», когда вы просматриваете теги

, поскольку вам нужен только абзац с «Первой абстракцией».

Поэтому добавьте поиск ( ) метод вашего 'para', чтобы проверить, присутствует ли ожидаемый текст или нет -

paragraphs = html.select("p")

Search = "The first abstraction" # expected text

for para in paragraphs:
    px = para.text
    if px.find(Search)>-1:
        print (para.text)

Это даст вам ожидаемый абзац как -

The history of mathematics can be seen as an ever-increasing series of abstractions. The first abstraction, which is shared by many animals,[14] was probably that of numbers: the realization that a collection of two apples and a collection of two oranges (for example) have something in common, namely quantity of their members.

Так что теперь параграф и название готово. Вам необходимо извлечь header . Сфокусируйтесь на файловой структуре html страницы, которую вы пытаетесь проанализировать (это всегда поможет).

На изображении ниже h2 - это брат p tag (где был найден ваш текст). Читайте о братьях и сестрах здесь .

enter image description here

Таким образом, чтобы перейти к непосредственному предыдущему брату, вы должны дважды вызвать 'previous_sibling' на p tag.

Поскольку h2 является родственным 2 тегами до p , вы можете получить доступ к h2 (который имеет заголовок «History») как -

paragraphs = html.select("p")
for para in paragraphs:
    px = para.text
    if px.find(Search)>-1:
        print (para.text)
        print(para.previous_sibling.previous_sibling.previous_sibling.previous_sibling.text)

Будет напечатано -

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