美丽的汤对象省略信息

时间:2013-06-14 19:06:52

标签: python regex beautifulsoup

问题:漂亮的汤对象似乎从HTML中删除了有价值的信息。为什么这样做,我该如何提取这个字段?

示例:我感兴趣的原始HTML表达了这一点:

<div id="KittyChow">
            <h4 class="noteText">foodAmount</h4>
            <span>< 1 tsp</span>
        </div>

然而,当我创建我的汤对象时,相应的HTML行变为:

<div id="KittyChow"><h4 class="noteText">foodAmount</h4><span></span></div>

我的问题和疑问:为什么删除span和/ span之间的信息?是因为“小于/&lt;”标志表明一些HTML所以它剥离了吗?我想知道为什么会这样。我似乎无法在文档中找到解释....有没有办法在BeautifulSoup中解析这个?

第二:我如何提取这个&lt; 1个参数?我尝试使用左右端点创建一个正则表达式,并且ALMOST正常工作。如果指定“左子串匹配”和“右子串匹配”,我知道如何使用正则表达式返回文本。例如,下面的代码将返回“cat”。

import re

string= "The cat is obese."
left= "The"
right= "is obese."

pattern= re.compile(left + "(.*?)" + right)
answer= pattern.findall(string)[0]

print answer

问题是,当我用HTML替换左右匹配字符串时,我得到“索引超出范围”错误,因为将HTML转换为字符串涉及的空格和缩进。

所以你可以说...我做了很多研究,而且我仍然坚持提取&lt;和&gt;使用BeautifulSoup和Python的正则表达式模块在HTML标记的字段/属性中进行标记。请帮我? :)

2 个答案:

答案 0 :(得分:1)

你有控制你的HTML吗?它是畸形的。而不是

<div id="KittyChow">
    <h4 class="noteText">foodAmount</h4>
    <span>< 1 tsp</span>
</div>

应该看起来像

<div id="KittyChow">
    <h4 class="noteText">foodAmount</h4>
    <span>&lt; 1 tsp</span>
</div>

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

如果您要在服务器端生成html,则应该可以使用任何语言轻松编码您的实体:php python ruby

编辑:根据其他答案:https://stackoverflow.com/a/14171433/1253312您可以这样做:

BeautifulSoup("<div> < 20 </div>", "html5lib")

告诉BS使用不同的解析器,它可以处理<字符。

答案 1 :(得分:0)

HTML破了。您不能在HTML中使用未转义的<字符;解析器会变得非常困惑。作为解决方法,在此特定示例中,您可以替换<,后跟空格&lt;后跟空格:

raw_html = raw_html.replace("< ", "&lt; ")

虽然这不是一般解决方案。