我想在python中解析HTML

时间:2012-06-19 13:25:21

标签: python html parsing

我有这个小班:

class HTMLTagStripper(HTMLParser):
    def __init__(self):
       self.reset()
       self.fed = []
    def handle_data(self, data):
       self.fed.append(data)
    def handle_starttag(self, tag, attrs):
       if tag == 'a':
           return attrs[0][1]
    def get_data(self):
       return ''.join(self.fed)

解析此HTML代码:

<div id="footer">
<p>long text.</p>
<p>click <a href="somelink.com">here</a>
</div>

这是我得到的结果:long text click here
但我想得到:long text click somelink.com

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:8)

看看BeautifulSoup ..它会做到这一点以及更多。

或者您可以使用正则表达式/字符串操作来去除所需的数据。从长远来看,使用像BeautifulSoup这样的东西会得到回报,特别是如果你希望做更多的事情。

以下是使用BeautifulSoup提取HTML数据中单/仅链接的一种方法(我不是这方面的专家,因此可能还有其他更好的方法 - 欢迎提出建议/更正)。

from BeautifulSoup import BeautifulSoup
s = """<div id="footer">
       <p>long text.</p>
       <p>click <a href="somelink.com">here</a>
       </div>"""

soup = BeautifulSoup(s)
your_link = soup.find('a', href=True)['href']
print 'long text click', your_link

将打印:

long text click somelink.com

答案 1 :(得分:0)

这对你不起作用:

x = re.compile(r'<.*?>')
stripped = x.sub('', html)

因为您还想从html标签中提取一些属性(如href)。

Levon指出:你应该选择BeautifulSoup。

答案 2 :(得分:0)

取而代之:

def handle_starttag(self, tag, attrs):
   if tag == 'a':
       return attrs[0][1]

有了这个:

def handle_starttag(self, tag, attrs):
   if tag == 'a':
       value = dict(attrs).get("href", None)
       if value:
           # add extra spaces since you dont sanitize
           # them in get_data
           self.fed.append(" %s " % value)

应该有点工作。或者不,取决于html源代码。这就是为什么我们有BeatifulSoup。

答案 3 :(得分:0)

我实际上是在检查这个新的html解析器库并提出这个解决方案:

from htmldom import htmldom
dom = htmldom.HtmlDom().createDom( """<div id="footer">
<p>long text.</p>
<p>click <a href="somelink.com">here</a>
</div>""");
nodes = dom.find( "p" ).children( all_children = True ) # this makes all text nodes to be in the set.
for node in nodes:
    if node._is( "a" ):
        print( node.attr( "href" ).strip() )
    elif node._is( "text" ):
        print( node.getNode().text, end = '', sep = ' ' )

您可以从Sourceforge或从python包索引下载库:HtmlDom,在python 3.x上运行,库的文档不是那么好但是可以理解。希望你喜欢这个答案:)