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で解析することはできず、読みに行く必要があります。