我正在尝试使用HTMLParser打印HTML文档仅的“p”标记中包含的任何内容,而不是其他类型标记中的任何其他内容。
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if "p" in tag:
print "Data in <p>:\n"
def handle_data(self, data):
print data
parser = MyHTMLParser()
parser.feed('<html><head><h1>The Lorem Ipsum</h1></head>'
'<body><p>Lorem ipsum dolor sit amet.</p><b>'
'<h2>Click Next for the next part.</h2><h3>'
'Coming Soon!</h3><p>Thanks.</p></body></html>')
使用它也会显示标题,这是我不想要的。
但是,当我尝试更改某些内容时,它应该只显示“数据”部分的“p”,“p”标记中不会显示任何内容。
def handle_data(self, tag, data):
if "p" in tag:
print data
我也很困惑,我是如何正确地构建我的代码才能使用它。
答案 0 :(得分:0)
您需要跟踪<p>
标记的时间:
class MyHTMLParser(HTMLParser):
__in_p = None
def handle_starttag(self, tag, attrs):
if tag == 'p':
self.__in_p = True
def handle_endtag(self, tag):
if tag == 'p':
self.__in_p = False
def handle_data(self, data):
if self.__in_p:
print("Encountered some data:", data)
如果代码本身可以嵌套(<p>
可以&{t},<div>
可以),则此代码无法使用。您可以使用BeautifulSoup
(pip install beautifulsoup4
),lxml.html
(lxml
)来解析HTML。
答案 1 :(得分:0)
由于HTMLParser
在单独的事件中显示数据,因此您需要跟踪状态,以便了解要打印的内容。此外,'p' in tag
会抓住任何带有&#39; p&#39;在它,但不是一个大写的P。
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.last_tag = ''
def handle_starttag(self, tag, attrs):
self.last_tag = tag
def handle_data(self, data):
if self.last_tag in ('p', 'P'):
print data
parser = MyHTMLParser()
parser.feed('<html><head><h1>The Lorem Ipsum</h1></head>'
'<body><p>Lorem ipsum dolor sit amet.</p><b>'
'<h2>Click Next for the next part.</h2><h3>'
'Coming Soon!</h3><p>Thanks.</p></body></html>')