Индексировать вне диапазона в Python при поиске тегов tr с помощью BeautifulSoup - PullRequest
0 голосов
/ 03 августа 2020

Итак, я пытаюсь сканировать данные ниже. И проблема в том, что я не знаю, сколько tr находится на веб-сайте, поэтому я просто сказал range(0, 24). Однако я почти уверен, что у него как минимум 24. Но код по-прежнему говорит, что он выходит за пределы допустимого диапазона.

Как мне сканировать этот веб-сайт и получить всю информацию (двуязычный текст), даже если я этого не сделаю? Не знаете, сколько там строк?

Ниже мой код.

from bs4 import BeautifulSoup
import requests

url="http://www.mongols.eu/mongolian-language/mongolian-tale-six-silver-stars/"

html_content = requests.get(url).text

soup = BeautifulSoup(html_content, "lxml")

gdp_table = soup.find("table", attrs={"class": "table-translations"})
gdp_table_data = gdp_table.tbody.find_all("tr")  # contains # rows

for i in range(0, 24):
    for td in gdp_table_data[i].find_all("td"):
        headings = []
        headings.append(td.get_text(strip=True))
        print(headings[1], " | ", headings[2])

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

Думаю, это лучшее решение для сохранения в формате csv:

import pandas as  pd

dfs = pd.read_html('http://www.mongols.eu/mongolian-language/mongolian-tale-six-silver-stars/')
df = pd.concat(dfs)
df.to_csv('a.csv')

сохраняет файл csv (a.csv) с данными.

Или только печать:

import requests
from bs4 import BeautifulSoup

r =requests.get('http://www.mongols.eu/mongolian-language/mongolian-tale-six-silver-stars/')
soup = BeautifulSoup(r.content, 'html.parser')
trs = soup.select('table.table-translations tr')
for tr in trs:
    print(tr.get_text())

печатает:

No.
Mongolian text
Loosely translated into English


1.
Зургаан мөнгөн мичид
Six silver stars


2.
Эрт урьд цагт зургаан өнчин хүүхэд товцог толгой дээр наадан суудаг юм санжээ.
Long ago, there were six orphan brothers playing on the top of a hill.



Тэгсэн чинь ах нь нэг өдөр хэлж:
One day the oldest brother said:

и так далее ...

0 голосов
/ 03 августа 2020

Этот скрипт запишет все переводы в data.csv:

import csv
import requests
from bs4 import BeautifulSoup


url = 'http://www.mongols.eu/mongolian-language/mongolian-tale-six-silver-stars/'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')

all_data = []
for row in soup.select('.table-translations tr')[1:]:
    mongolian, english = map(lambda t: t.get_text(strip=True), row.select('td')[1:])
    all_data.append((mongolian, english))

with open('data.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for row in all_data:
        spamwriter.writerow(row)

Создает:

введите описание изображения здесь

0 голосов
/ 03 августа 2020

Вы уже перебираете каждый элемент в gdp_table_data[i].find_all("td"). Используйте ту же идею для итерации строки

for tr in gdp_table_data:
    for td in tr.find_all("td"):
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...