Я пытался сделать простую функцию, используя красивый суп, чтобы вытащить все примеры предложений с веб-сайта под названием Tangorin для одной японской книги. Я пытался написать два разных типа функций для извлечения этих данных, и я просто не могу заставить их работать. Извините, это длинный вопрос, но я пробовал несколько вещей, которые не работают. кодирование за 3 недели. Структура данных, которую я пытаюсь извлечь, выглядит так:
Below here is the data structure for one of the sentences on the page for the word 英語 as the search term, web page https://tangorin.com/sentences?search=英語.
Я пытаюсь вывести все предложения на страницу в список отдельных предложений. Каждое предложение находится внутри блока, как показано ниже, и я выделил ключевую информацию, которую пытаюсь найти.
**<div class="entry entry-border sentences undefined ">**
<div class="entry-menu-wrap">
<button class="entry-menu-btn btn">
<svg class="icon" role="img" alt="" width="1em" height="1em" viewBox="0 0 50 50">
<use xlink:href="#icon-chevron-down">
</use>
</svg>
</button>
</div>
<dt class="s-jp" lang="ja">
<a href="/words?search=話 %23n">
<ruby>
**話**
<rt class="roma">hanashi</rt>
</ruby>
</a>
<a href="/words?search=を %23part">
<ruby>
**を**
<rt class="roma">wo</rt>
</ruby>
</a>
<a href="/words?search=為る %23v">
<ruby>
**する**
<rt class="roma">suru</rt>
</ruby>
</a>
<a href="/words?search=事 %23n">
<ruby>
**こと**
<rt class="roma">koto</rt>
</ruby>
</a>
<a href="/words?search=で %23part">
<ruby>
**で**
<rt class="roma">de</rt>
</ruby>
</a>
<a href="/words?search=自分 %23n">
<ruby>
**自分**
<rt class="roma">jibun</rt>
</ruby>
</a>
<a href="/words?search=を %23part">
<ruby>
**を**
<rt class="roma">wo</rt>
</ruby>
</a>
<ruby>
**曝け出す**
<rt class="roma">曝kedasu</rt>
</ruby>
<a href="/words?search=事 %23n">
<ruby>
**こと**
<rt class="roma">koto</rt>
</ruby>
</a>
<a href="/words?search=を %23part">
<ruby>
**を**
<rt class="roma">wo</rt>
</ruby>
</a>
<a href="/words?search=恐れる %23v">
<ruby>
**恐れず**
<rt class="roma">osorezu</rt>
</ruby>
</a>
**、**
<a href="/words?search=英語 %23n">
<mark>
<ruby>
**英語**
<rt class="roma">eigo</rt>
</ruby>
</mark>
</a>
<a href="/words?search=で %23part">
<ruby>
**で**
<rt class="roma">de</rt>
</ruby>
</a>
<a href="/words?search=他人 %23n">
<ruby>
**他人**
<rt class="roma">tanin</rt>
</ruby>
</a>
<a href="/words?search=と %23part">
<ruby>
**と**
<rt class="roma">to</rt>
</ruby>
</a>
<a href="/words?search=喋る %23v">
<ruby>
**しゃべる**
<rt class="roma">shaberu</rt>
</ruby>
</a>
<a href="/words?search=有らゆる %23pn-adj">
<ruby>
**あらゆる**
<rt class="roma">arayuru</rt>
</ruby>
</a>
<a href="/words?search=機会 %23n">
<ruby>
**機会**
<rt class="roma">kikai</rt>
</ruby>
</a>
<a href="/words?search=を %23part">
<ruby>
**を**
<rt class="roma">wo</rt>
</ruby>
</a>
<a href="/words?search=捕らえる %23v">
<ruby>
**とらえ**
<rt class="roma">torae</rt>
</ruby>
</a>
<a href="/words?search=なさる %23v">
<ruby>
**なさい**
<rt class="roma">nasai</rt>
</ruby>
</a>
**。**
<a href="/words?search=そうすれば %23adv">
<ruby>
**そうすれば**
<rt class="roma">sousureba</rt>
</ruby>
</a>
<a href="/words?search=直に %23n">
<ruby>
**じきに**
<rt class="roma">jikini</rt>
</ruby>
</a>
<a href="/words?search=形式張る %23n">
<ruby>
**形式張らない**
<rt class="roma">keishikiharanai</rt>
</ruby>
</a>
<a href="/words?search=会話 %23n">
<ruby>
**会話**
<rt class="roma">kaiwa</rt>
</ruby>
</a>
<a href="/words?search=の %23part">
<ruby>
**の**
<rt class="roma">no</rt>
</ruby>
</a>
<a href="/words?search=場面 %23n">
<ruby>
**場面**
<rt class="roma">bamen</rt>
</ruby>
</a>
<a href="/words?search=で %23part">
<ruby>
**で**
<rt class="roma">de</rt>
</ruby>
</a>
<a href="/words?search=気楽 %23n">
<ruby>
**気楽**
<rt class="roma">kiraku</rt>
</ruby>
</a>
<a href="/words?search=に %23part">
<ruby>
**に**
<rt class="roma">ni</rt>
</ruby>
</a>
<a href="/words?search=慣れる %23v">
<ruby>
**なれる**
<rt class="roma">nareru</rt>
</ruby>
</a>
<a href="/words?search=である %23aux-v">
<ruby>
**であろう**
<rt class="roma">dearou</rt>
</ruby>
</a>
**。**
</dt>
Итак, в чем проблема внутри класса, данные, которые я хочу, хранятся в одном из 3 способов, внутри гиперссылки a = href, а затем в сокращении ruby. Или в сокращении ruby, которое не находится внутри a = href, или просто иногда в простой текстовой строке в случае «、», «。», «?» et c.
Итак, я написал следующий код с большой помощью моего друга, использующего красивый Soup:
# all of your sentences from anki deck
# also new sentences will go here
ALL_SENTENCES = set()
# This piece of code returns true if char is in the set of all roman letters
# and false if not
def is_english(char):
lower_case = ord("a") <= ord(char) <= ord("z")
upper_case = ord("A") <= ord(char) <= ord("Z")
return lower_case or upper_case
# This piece of code is to take a random Japanese word from a file and
# generate a Tangorin URL to the page of example
# sentencese for that word
def make_url(word):
return f"https://tangorin.com/sentences?search={word}"
# This function searches through all of the descendants that have been added into the total
def filter_jap(sentences):
jap_only = [
[word for word in sentence if not is_english(word[0])] for sentence in sentences
]
for sentence in jap_only:
as_string = "".join(sentence) + "\n"
print(as_string)
def get_random_sentence(all_sentences):
return random.choice(all_sentences)
def get_example_sentences(word):
url = make_url(word)
source = requests.get(url).text
soup = BeautifulSoup(source, "lxml")
all_sentences = []
curr_sentence = ""
for sentence in soup.findAll(
"div", class_="entry entry-border sentences undefined"
):
character_blocks = sentence.dt
for desc in character_blocks.descendants:
# end of sentence detected, add curr sentence to all sentence list
# and reset curr sentence
if desc == "。":
all_sentences.append(curr_sentence)
curr_sentence = ""
# if character is non-english (japanese) add it to current sentence
elif type(desc) == NavigableString and not is_english(desc[0]):
curr_sentence += desc
return all_sentences
def gen_example_sentence(word):
all_sentences = get_example_sentences(word)
random_choice = get_random_sentence(all_sentences)
return(random_choice)
with open('Japanese Words.txt', 'r', encoding="utf-8") as f:
for line in f:
x = gen_example_sentence(line)
print(x)`
Проблема с этим кодом заключается в том, что он сталкивается с блок вроде этого:
<ruby>
**曝け出す**
<rt class="roma">曝kedasu</rt>
</ruby>
Здесь элемент в классе rt аббревиатуры ruby неправильно отформатирован с использованием японского символа в начале, поэтому понимание for l oop, которое анализирует потомков navigablestring тип, начинающийся с символа Engli sh, здесь полностью не работает. Поэтому я попытался go другой подход к манипуляциям со строками, но мои навыки программирования все еще недостаточны, поэтому это был серьезный провал:
`def make_url(word):
return f"https://tangorin.com/sentences?search={word}"
word = "英語"
url = make_url(word)
source = requests.get(url).text
soup = BeautifulSoup(source, "lxml")
all_sentences = []
curr_sentence = ""
for sentence in soup.findAll("div", class_="entry entry-border sentences undefined"):
y = sentence.dt
for line in y:
if str(type(line)) == "<class 'bs4.element.Tag'>":
x = str(line.ruby)
block = str(x.split('<'))
block = str(block.split('>'))
print(block)[3]
#else:
#curr_sentence += line
#print(curr_sentence)
#curr_sentence = ""`
Я не знаю, как go о исправление этой проблемы для получения точной информации, необходимой мне для успешной перекомпиляции предложений, а затем добавления их в набор строк.
Для некоторых дополнительных знаний на основе японского языка в японских предложениях нет пробелов между символами, кроме где пробелы встроены в некоторые символы, такие как '、' '。' '「' '」'
Также теги ruby - это так называемая аббревиатура ruby, которая является способом описания позиции японца. и способ чтения с английскими sh символами над ним. «Рома» означает ромадзи, что означает англ sh количество символов для японских слов
Извините, это такой длинный вопрос, но я просмотрел тонну видеороликов на YouTube о beautifulsoup и других методах синтаксического анализа, и я просто могу Не могу понять эту проблему
Также на случай, если жирный не работает, внутри блока xml в индикаторах ** ** есть биты, которые я хочу вытаскивать. По сути, то, что мне нужно, - это материал внутри сокращений ruby, но не в классе rt, и мне также нужны эти простые текстовые элементы «、», «。» и c. Если вы запустите исходный код потомков, вы получите предложения с точностью 99%, чтобы увидеть, какой результат мне нужен. Заранее благодарим всех, чья помощь !!!