Разделить по тегу bs4 / Получить текст между двумя тегами - PullRequest
0 голосов
/ 08 февраля 2019

В настоящее время я пытаюсь прочитать текст между двумя тегами с веб-страницы.

Пока это мой код:

soup = BeautifulSoup(r.text, 'lxml')

text = soup.text

tag_one = soup.select_one('div.first-header')


tage_two = soup.select_one('div.second-header')



text = text.split(tag_one)[1]
text = text.split(tage_two)[0]

print(text)

В основном я пытаюсь получить текст между первыми второй заголовок, идентифицируя их теги.Я планировал сделать это, разделив первый тег и второй тег.Это вообще возможно?Есть ли более умный способ сделать это?

Пример: Если вы посмотрите на: https://en.wikipedia.org/wiki/Python_(programming_language)

Я хотел бы найти способ извлечь текст в разделе «История», определив теги.«История» и «Особенности и философия» и разбиение по этим тегам.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

С BeautifulSoup 4.7+ возможность выбора CSS значительно улучшена.Эту задачу можно выполнить с помощью селектора CSS4 :has(), который теперь поддерживается в BeautifulSoup:

import requests
from bs4 import BeautifulSoup

website_url = requests.get("https://en.wikipedia.org/wiki/Python_(programming_language)").text
soup = BeautifulSoup(website_url, "lxml")
els = soup.select('h2:has(span#History) ~ *:has(~ h2:has(span#Features_and_philosophy))')
with codecs.open('text.txt', 'w', 'utf-8') as f:
    for el in els:
        print(el.get_text())

Вывод:

 Guido van Rossum at OSCON 2006.Main article: History of PythonPython was conceived in the late 1980s[31] by Guido van Rossum at Centrum Wiskunde & Informatica (CWI) in the Netherlands as a successor to the ABC language (itself inspired by SETL)[32], capable of exception handling and interfacing with the Amoeba operating system.[7] Its implementation began in December 1989.[33] Van Rossum's long influence on Python is reflected in the title given to him by the Python community: Benevolent Dictator For Life (BDFL) –  a post from which he gave himself permanent vacation on July 12, 2018.[34]
Python 2.0 was released on 16 October 2000 with many major new features, including a cycle-detecting garbage collector and support for Unicode.[35]
Python 3.0 was released on 3 December 2008. It was a major revision of the language that is not completely backward-compatible.[36] Many of its major features were backported to Python 2.6.x[37] and 2.7.x version series.  Releases of Python 3 include the 2to3 utility, which automates (at least partially) the translation of Python 2 code to Python 3.[38]
Python 2.7's end-of-life date was initially set at 2015 then postponed to 2020 out of concern that a large body of existing code could not easily be forward-ported to Python 3.[39][40] In January 2017, Google announced work on a Python 2.7 to Go transcompiler to improve performance under concurrent workloads.[41]
0 голосов
/ 08 февраля 2019

Вы не можете сделать это так, как надеетесь, потому что BS4 работает с dom, структурой дерева, а не чем-то линейным.

Используя ваш пример вики, то, что вы действительно ищетеis

  1. find id = "History" (это промежуток)
  2. Перейдите к элементу H2 - запомните это как отправную точку.
  3. find id= "Features_and_philosophy" (это другой промежуток)
  4. Перейдите к ближайшему элементу H2 - запомните, что это конечная точка.

Теперь обратите внимание, что два элемента H2 являются родственными.(у них один и тот же родитель).Итак, что вы хотите сделать, это получить каждого брата между началом H2 и окончанием H2, и, для каждого брата, получить полный текст каждого брата.

Это не сложно, но это цикл, где выСравнивайте каждого брата, пока не дойдете до конечного.Ничего более простого, чем вы надеялись.

В более общем случае это намного сложнее (или на самом деле утомительно), поскольку вам, возможно, придется идти вверх и вниз по дереву DOM в поисках подходящего элемента.

...