0

我有这个小班:

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

4 回答 4

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

于 2012-06-19T13:27:00.633 回答
0

这对您不起作用:

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

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

正如 Levon 指出的那样:你应该选择 BeautifulSoup。

于 2012-06-19T13:28:54.363 回答
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 的原因。

于 2012-06-19T14:28:05.237 回答
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,该库的文档不是很好,但可以理解。希望你喜欢这个答案:)

于 2012-07-19T03:45:05.310 回答