Python / Beautifulsoup: HTML Путь к текущему элементу - PullRequest
0 голосов
/ 11 апреля 2020

Для проекта класса я работаю над извлечением всех ссылок на веб-странице. Это то, что я имею до сих пор.

from bs4 import BeautifulSoup, SoupStrainer

with open("input.htm") as inputFile:
    soup = BeautifulSoup(inputFile)

outputFile=open('output.txt', 'w')
for link in soup.find_all('a', href=True):
outputFile.write(str(link)+'\n')
outputFile.close()

Это работает очень хорошо.

Вот сложность: для каждого элемента <a> мой проект требует, чтобы я знал всю "древовидную структуру" "к текущей ссылке. Другими словами, я хотел бы знать все прецедентные элементы, начиная с элемента <body>. И class и id по пути.

Как страница навигации в Windows проводнике. Или панель навигации в инструменте проверки элементов во многих браузерах.

Например, если вы посмотрите страницу Библии в Википедии и ссылку на страницу Википедии для Талмуда, следующий «путь» - это то, что я ». ищу.

<body class="mediawiki ...>
 <div id="content" class="mw-body" role="main">
  <div id="bodyContent" class="mw-body-content">
   <div id="mw-content-text" ...>
    <div class="mw-parser-output">
     <div role="navigation" ...>
      <table class="nowraplinks ...>
       <tbody>
        <td class="navbox-list ...>
         <div style="padding:0em 0.25em">
          <ul>
           <li>
            <a href="/wiki/Talmud"

Спасибо большое. -Maureen

Ответы [ 2 ]

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

Вот решение, которое я только что написал. Он работает, находя элемент, затем перемещаясь вверх по дереву по родительскому элементу. Я анализирую только открывающий тег и добавляю его в список. Переверните список в конце. Наконец, мы получаем список, который напоминает запрошенное вами дерево.

Я написал его для одного элемента, вы можете изменить его для работы с вашим find_all

from bs4 import BeautifulSoup
import requests

page = requests.get("https://en.wikipedia.org/wiki/Bible")
soup = BeautifulSoup(page.text, 'html.parser')

tree = []

hrefElement = soup.find('a', href=True)
hrefString = str(hrefElement).split(">")[0] + ">"
tree.append(hrefString)

hrefParent = hrefElement.find_parent()
while (hrefParent.name != "html"):
    hrefString = str(hrefParent).split(">")[0] + ">"
    tree.append(hrefString)
    hrefParent = hrefParent.find_parent()

tree.reverse()
print(tree)
1 голос
/ 11 апреля 2020

Попробуйте этот код:

soup = BeautifulSoup(inputFile, 'html.parser')

Или используйте l xml:

soup = BeautifulSoup(inputFile, 'lxml')

Если он не установлен:

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