문제: 루비 태그 붙어 있는 문자열은 bs4 라이브러리로 .string 했을 때 None을 반환함.
원인:
이 문제를 제출해 주셔서 감사합니다. 보고 있는 동작은 .string 작동 방식의 부작용입니다. 이것은 1698990을 발행하기에 충분히 가깝고 중복으로 표시할 것입니다.
'tag'와 'string'을 find() 메서드에 전달하면 .string 값이 해당 태그인 태그를 찾습니다. 태그에 둘 이상의 항목이 포함된 경우 .string이 무엇을 참조해야 하는지 명확하지 않으므로 .string은 없음으로 정의됩니다. ( https://www.crummy.com/software/ BeautifulSoup/ bs4 /doc / #string )
문자열과 주석을 모두 포함하는 <p> 태그에는 .string이 없음으로 설정되어 있으므로 문제_ 수프.find( 'p', string= re.compile( r".*")) 는 아무 것도 일치하지 않습니다. -- 태그 내부에 문자열이 있지만 다른 것도 있으므로 .string은 정의되지 않고 .string에서 일치시키려는 시도는 일치하지 않습니다.
태그와 문자열이 모두 제공될 때 find()의 동작을 변경하는 제안인 문제 1645513에 관심이 있을 수 있습니다. 당신은 find()가 그것과 다르게 행동할 것으로 기대하는 첫 번째 사람은 아니지만, 내가 제안한 해결책은 https: //bugs.launchpad .net/beautifuls oup /+bug/ 1645513/ comments/ 3 또한 예상대로 행동하지 마십시오.
내부에 태그가 있으면 .string
했을 때 None
을 반환하는 듯 하다.
출처:Bug #1713129 “find and find_all: string matching doesn't work wh...” : Bugs : Beautiful Soup
해결: 텍스트 전처리하여 태그를 뗀다. 이때 후리가나는 떼고 한자만 남긴다.
text_processed = re.sub("<ruby>|<\/ruby>|<rt>.+?<\/rt>|<rb>|<\/rb>","",text)
아래는 전처리 전체 코드
import re
def pre_processing_no_ruby(filepath, filepath2):
# filepath example: abc/main/hello.html
with open(filepath, 'r', encoding="UTF8") as file:
text = file.read()
print(text, "====s")
text_processed = re.sub("<ruby>|<\/ruby>|<rt>.+?<\/rt>|<rb>|<\/rb>","",text)
print(text_processed)
with open(filepath2, 'a+', encoding="UTF8") as file2:
file2.write(text_processed)