0

以下の形式のテキスト ファイルがあり、<doc>タグ間のテキストを取得しようとしています。しかし、<doc>タグが何度も繰り返され、ファイルが標準の xml または html 形式ではないため、問題が発生します。

フォーマット:

<doc id = "some_number" url = " some_link " title = " some_title " >

text here

</doc>//また

<doc id = "some_number" url = " some_link " title = " some_title " >

text here

</doc> // 等々

Python で Beautifulsoup を使用してテキストを取得しようとしましたが、このオブジェクトは呼び出し可能ではないと言われました。これは、html ファイル形式ではないためだと推測しています。さらに正規表現を使ってみたので書いてみました

pattern = re.compile("<doc.*?>(.*?)</doc>")

pattern.findall(string_text) # string_text is my file

しかし、一致するものは見つかりません。

ご協力いただきありがとうございます。

4

2 に答える 2

2

HTML に目に見える問題はなく、BeautifulSoup が解析できない理由はありません。例えば:

from bs4 import BeautifulSoup

s = '''
<doc id = "some_number" url = " some_link " title = " some_title " >

text here

</doc>

<doc id = "some_number" url = " some_link " title = " some_title " >

text here

</doc>'''

soup = BeautifulSoup(s)
for doc in soup.find_all('doc'):
    print('{}: {}'.format(doc['title'], doc.text))

これを実行すると、次のように表示されます。

 some_title :
text here

 some_title :
text here

あなたの質問にあったが、コードセクションの外にあった C++ スタイルのコメントを残した場合にも機能します。


「このオブジェクトは呼び出し可能ではないと言われている」場合は、明らかにコードに何か問題があります。たとえば、これを行うと:

for doc in soup.find_all('doc'):
    doc['title']('text')

…もちろん発生します:

TypeError: 'str' object is not callable

しかし、これは BS が HTML を解析できなかったからではなく、BS から文字列を取得し、それを関数として呼び出そうとしたためです。

あなたが私たちにコードを見せていないか、あなたが得た正確なエラーさえも見せていないので、あなたが実際に何を間違えたのかわかりませ.


一方、HTML の何が問題なのか疑問に思っている場合は、3 つの問題があります。

最初の問題は、HTML を regexp で解析できないことです

2番目の問題は、特に改行を使用して、ドキュメント.*?の最上部近くで一致させようとしていることです。re

'.'

(ドット) デフォルト モードでは、これは改行以外の任意の文字に一致します。DOTALL フラグが指定されている場合、これは改行を含む任意の文字に一致します。

だから、あなたが必要pattern = re.compile("<doc.*?>(.*?)</doc>", re.DOTALL)です。

ただし、 aの内部にdoc別のdoc文字を含めることができる場合、または引用符内に混乱を招く文字を含めることができる場合、または…まあ、これが失敗する理由はたくさんあります。というわけで:

3 番目の問題は、あなたが読んでいないことです。HTML を regexpで解析することはできず、読みに行く必要があります。

于 2013-10-07T21:56:35.393 に答える
1
your_doc = """
         <doc id = "some_number" url = " some_link " title = " some_title " >
         text here
         </doc> //then again

         <doc id = "some_number" url = " some_link " title = " some_title " >
         text here
         </doc>
         """
from bs4 import BeautifulSoup as b

soup = b(your_doc)

specific_doc = b.find('doc', {'id': 'some number'}) #to get a doc with given id. 
print specific_doc.contents #printing the text

all_docs = b.findAll('docs') # list of all doc tags.
for doc in all_docs: #printing all the texts
    print 'Text in doc id:', doc['id']
    print doc.contents
于 2013-10-07T22:01:29.273 に答える