Извлечение всего между двумя тегами l xml Python - PullRequest
0 голосов
/ 01 мая 2020

Рассмотрим следующий html фрагмент

<html>
  .
  .
  .
  <div>
    <p> Hello </p>
    <div>
      <b>
        Text1
      </b>
      <p>
        This is a huge paragraph text
      </p>
       .
       .
       .
     </div>
  </div>
  .
  .
  .
  <div>
    <i>
      Text2
    </i>
  </div>
  
 
  
      
  
  

Допустим, мне нужно извлечь все от Text1 до Text2, включая теги. Используя несколько методов, я смог извлечь теги этих двух, то есть их уникальный идентификатор.

По сути, у меня есть 2 элемента Element.etree, соответствующих двум тегам, которые мне нужны.

Как мне извлечь все, что находится между двумя тегами?

(Одно из возможных решений, которое я могу придумать, - это найти двух общих предков тегов, выполнить iterwalk() и начать извлечение в Element1 и остановиться на 2. Однако я не совсем уверен, как это будет) Любое решение будет оценено.

Обратите внимание, что я уже нашел два тега, которые мне нужны, и я не ищу решения для найти эти теги (например, используя xpath)

Редактировать: Мой желаемый вывод -

      <b>
        Text1
      </b>
      <p>
        This is a huge paragraph text
      </p>
       .
       .
       .
     </div>
  </div>
  .
  .
  .
  <div>
    <i>
      Text2
    </i>

Обратите внимание, что я не возражаю против начальных тегов 2 <div>, но не хочу Hello. То же самое относится и к закрывающим тегам конца. В основном меня интересует промежуточное содержимое.

Редактировать 2: Я извлек элементы Etree, используя сложные условия xpath, что было невозможно с другими альтернативами, такими как bs4, поэтому любое решение с использованием l xml элементы будут оценены:)

1 Ответ

0 голосов
/ 01 мая 2020

После просмотра и допроса:

from essentials.tokening import CreateToken # This was imported just to generate a random string - pip install mknxgn_essentials
import bs4

HTML = """<html>
    <div>
        <div>
            <div id="start">
                Hello, My name is mark
            </div>
        </div>
    </div>

    <div>
        This is in the middle
    </div>

    <div>
        <div id="end">
            This is the end
        </div>
    </div>

    <div>
        Do not include this.
    </div>

</html>"""

RandomString = CreateToken(30, HTML) #Generate a random string that could never occur on it's own in the file, if it did occur, use something else 
soup = bs4.BeautifulSoup(HTML, features="lxml") # Convert the text into soup
start_div = soup.find("div", attrs={"id": "start"}) #assuming you can find this element
start_div.insert_before(RandomString) # insert the random string before this element
end_div = soup.find("div", attrs={"id": "end"})     #again, i was assuming you can also find this element
end_div.insert_after(RandomString) # insert the random string after this element

print(str(soup).split(RandomString)[1]) # Get between both random strings

Выходные данные возвращаются:

>>>             <div id="start">
>>>                 Hello, My name is mark
>>>             </div>
>>>     </div>
>>> </div>
>>>     <div>
>>>         This is in the middle
>>>     </div>
>>> <div>
>>>     <div id="end">
>>>         This is the end
>>>     </div>
...