如何让BeautifulSoup将textarea标签的内容解析为HTML?
问题描述:
3.0.5之前,BeautifulSoup用于将文本区域的内容作为HTML处理。它现在将其视为文本。我正在解析的文档在textarea标签内部有HTML,我正在尝试处理它。如何让BeautifulSoup将textarea标签的内容解析为HTML?
我已经试过:
for textarea in soup.findAll('textarea'):
contents = BeautifulSoup.BeautifulSoup(textarea.contents)
textarea.replaceWith(contents.html(text=True))
但我发现了错误。我无法在文档中找到它,而替代解析器不起作用。任何人都知道我可以如何将textareas解析为HTML?
编辑:
样本HTML是:
<textarea class="ks-lazyload-custom">
<div class="product-view product-view-rug">
Foobar Womble
<div class="product-view-head">
<img src="tps/i1/fo-25.gif" />
</div>
</div>
</textarea>
错误是:
File "D:\src\cross\tserver\src\tools\sitecrawl\BeautifulSoup.py", line 1913,
in _detectEncoding '^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)
TypeError: expected string or buffer
我正在寻找的服用元素,提取内容,与解析他们的方式BeautifulSoup,将其折叠为文本,然后用该文本替换原始元素的内容(或替换整个元素)。
至于真实世界与规格,这里其实并不特别相关。数据需要解析,我正在寻找这样做的方式。
答
这似乎是工作得相当好(如果我理解正确的,你想要的东西):
for textarea in soup.findAll('textarea'):
contents = BeautifulSoup.BeautifulSoup(textarea.contents[0]).renderContents()
textarea.replaceWith(contents)
+0
谢谢,这似乎确实做了我所追求的。 – brofield 2010-04-20 02:54:23
答
我现在使用下面的代码主要工作。你的milage可能会有所不同。
def _extractText(self, data, encoding):
if self.isDebug: self._output("_extractText")
soup = BeautifulSoup.BeautifulSoup(data, fromEncoding=encoding)
comments = soup.findAll(text=lambda text:isinstance(text, BeautifulSoup.Comment))
[comment.extract() for comment in comments]
[script.extract() for script in soup.findAll('script')]
[css.extract() for css in soup.findAll('style')]
for textarea in soup.findAll('textarea'):
textarea.string = self._extractText(textarea.renderContents(), 'UTF-8')
text = unicode('')
for line in soup.findAll(text=True):
line = line.replace(' ', ' ').strip()
if line == '': continue
if line.startswith('doctype'): continue
if line.startswith('DOCTYPE'): continue
text = text + line + '\n'
return text
您可以包括一个小的HTML片段? – 2010-04-19 05:54:13
您正试图获得HTML解析器来支持HTML规范禁止的数据结构。你应该退后一步,找到解决问题的另一种方式(即不依赖于包含CDATA以外的其他文本的文本文件) – Quentin 2010-04-19 05:54:29
您能否发布错误输出?没有它,我们没有太多可以脱离的地方。 – 2010-04-19 05:54:37