Я использую BeautifulSoup (версия 4.4) для предварительной обработки текстового указателя Wikipedia с https://dumps.wikimedia.org/enwiki/ для дальнейшего разбора.
Документ textdump содержит несколько статей, каждый из которых содержится в <page>
.
К сожалению, что-то о структуре документа кажется несовместимым с BeautifulSoup: внутри каждой <page>
текстовое тело статьи содержится в блоке <text>
:
<text xml:space="preserve">...</text>
Как только я выбрал определенный блок <page>
, я должен иметь доступ к содержимому текстового блока как page.text.string
.
В BeautifulSoup .text
используется для резервирования содержимого тега между его скобками. В более поздних версиях для этого используется .string
.
К сожалению, похоже, что page.text
по-прежнему интерпретируется так же, как и page.string
для обратной совместимости. (Edit: getattr(page, "text")
делает то же самое.)
Есть ли способ обойти это и получить доступ к тегу HTML с именем <text>
?
(Изменение: пример синтаксиса см. В https://pastebin.com/WQvJn0gf.)
Использование .find
и .text
работает так, как ожидалось:
from bs4 import BeautifulSoup
string = '''<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
<siteinfo>...</siteinfo>
<page>
<title>AccessibleComputing</title>
<ns>0</ns>
<id>10</id>
<redirect title="Computer accessibility" />
<revision>
<id>854851586</id>
<parentid>834079434</parentid>
<timestamp>2018-08-14T06:47:24Z</timestamp>
<contributor>
<username>Godsy</username>
<id>23257138</id>
</contributor>
<comment>remove from category for seeking instructions on rcats</comment>
<model>wikitext</model>
<format>text/x-wiki</format>
<text xml:space="preserve">#REDIRECT [[Computer accessibility]]
{{R from move}}
{{R from CamelCase}}
{{R unprintworthy}}</text>
<sha1>42l0cvblwtb4nnupxm6wo000d27t6kf</sha1>
</revision>
</page>
...
</mediawiki>'''
soup = BeautifulSoup(string, 'html.parser')
page_tag = soup.find('page')
text_tag = page_tag.find('text')
print(text_tag.text)
# #REDIRECT [[Computer accessibility]]
# {{R from move}}
# {{R from CamelCase}}
# {{R unprintworthy}}
<text>
.