L oop через список BeautifulSoup и разберите каждый на HTML теги и проблемы с данными - PullRequest
0 голосов
/ 17 марта 2020

Python 3 программиста, новичок в BeautifulSoup и HTMLParser. Я использую BeautifulSoup для извлечения всех данных списка определений из файла HTML и пытаюсь сохранить данные dt и данные dd в словаре python в виде пар ключ-значение соответственно. Мой HTML файл (List_page. html):

<!DOCTYPE html>
<html lang="en">
<head>STH here</head>
<body>
    <!--some irrelavent things here-->
    <dl class="key_value">
        <dt>Sine</dt>
        <dd>The ratio of the length of the opposite side to the length of the hypotenuse.</dd>
        <dt>Cosine</dt>
        <dd>The ratio of the length of the adjacent side to the length of the hypotenuse.</dd>
    </dl>
    <!--some irrelavent things here-->    
</body>
</html>

, тогда как когда мой Python код:

from bs4 import BeautifulSoup
from html.parser import HTMLParser

dt = []
dd = []
dl = {}

class DTParser(HTMLParser):
    def handle_data(self, data):
        dt.append(data)

class DDParser(HTMLParser):
    def handle_data(self, data):
        dd.append(data)

html_page = open("List_page.html")
soup = BeautifulSoup(html_page, features="lxml")

dts = soup.select("dt")
parser = DTParser()

# Start of part 1:
parser.feed(str(dts[0]).replace('\n', ''))
parser.feed(str(dts[1]).replace('\n', ''))
# end of part 1

dds = soup.select("dd")
parser = DDParser()

# Start of part 2
parser.feed(str(dds[0]).replace('\n', ''))
parser.feed(str(dds[1]).replace('\n', ''))
# End of part 2

dl = dict(zip(dt, dd))
print(dl)

, вывод:

enter image description here

Это выводит материал правильно, как и ожидалось. Однако, когда я заменяю часть 1 (или 2) на l oop, она начинает go неправильно: например,

, код:

# Similar change for part 2
for dt in dts:
    parser.feed(str(dts[0]).replace('\n', ''))

только в этом случае говорит мне определение косинуса, а не синуса. С 2 предметами я могу сделать это без всего oop. Но что, если я получу больше предметов? Поэтому хочу узнать правильный способ сделать это. Спасибо.

1 Ответ

2 голосов
/ 17 марта 2020

Вы получаете первый элемент dts в для l oop на каждой итерации с dts[0] вместо обновления индекса с помощью l oop. Измените его на:

for i in range(len(dts)):
    parser.feed(str(dts[i]).replace('\n', ''))

и

for i in range(len(dds)):
    parser.feed(str(dds[i]).replace('\n', ''))
...