您的 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 出了什么问题,那么存在三个问题。
第一个问题是您无法使用 regexp 解析 HTML。
第二个问题是你试图使用.*?
匹配,除其他外,换行符,并且就在文档的最顶部附近re
,它说:
'.'
(点。)在默认模式下,这匹配除换行符以外的任何字符。如果指定了 DOTALL 标志,则它匹配任何字符,包括换行符。
所以,你需要pattern = re.compile("<doc.*?>(.*?)</doc>", re.DOTALL)
.
但是,如果 adoc
可以有另一个doc
内部,或者如果您可以在引号中包含任何会让您感到困惑的字符,或者如果......好吧,这可能会失败的原因有很多。这就是为什么:
第三个问题是您没有阅读You can't parse HTML with regexp,您需要阅读它。