我有这个小班:
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
有办法做到这一点吗?
答案 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上运行,库的文档不是那么好但是可以理解。希望你喜欢这个答案:)