Python “打印HTML”;p";仅节点
我正在尝试使用HTMLPasser只打印HTML文档的“p”标记中包含的任何内容,而不打印其他类型标记中的任何内容Python “打印HTML”;p";仅节点,python,html,Python,Html,我正在尝试使用HTMLPasser只打印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_dat
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>')
我还不知道我应该如何正确地构建代码以使其工作。您需要跟踪您在
标记中的时间:
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)
如果标记可能嵌套在自身中(
不能,
可以),则此代码将不起作用。您可以使用(pip-install-beautifulsoup4
)和(lxml
)来解析html。您需要跟踪您在标记中的时间:
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)
如果标记可能嵌套在自身中(
不能,
可以),则此代码将不起作用。您可以使用(pip-install-beautifulsoup4
)和(lxml
)解析html。由于HTMLParser
在单独的事件中显示数据,因此您需要跟踪状态,以便知道要打印什么。此外,标记中的'p
将捕获任何带有“p”的标记,但不包含大写的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>')
从HTMLParser导入HTMLParser
类MyHtmlPasser(HtmlPasser):
定义初始化(自):
HTMLPasser.\uuuuu初始化\uuuuuuuuu(自)
self.last_标记=“”
def句柄\u开始标记(自身、标记、属性):
self.last_tag=标记
def句柄_数据(自身、数据):
如果self.last_标记位于('p','p'):
打印数据
parser=MyHTMLParser()
feed('The Lorem Ipsum'
“Lorem ipsum door sit amet.”
'单击“下一步”进入下一部分。'
“马上就来!谢谢。”)
由于HTMLParser
在一个单独的事件中显示数据,因此您需要跟踪状态,以便知道要打印什么。此外,标记中的'p
将捕获任何带有“p”的标记,但不包含大写的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>')
从HTMLParser导入HTMLParser
类MyHtmlPasser(HtmlPasser):
定义初始化(自):
HTMLPasser.\uuuuu初始化\uuuuuuuuu(自)
self.last_标记=“”
def句柄\u开始标记(自身、标记、属性):
self.last_tag=标记
def句柄_数据(自身、数据):
如果self.last_标记位于('p','p'):
打印数据
parser=MyHTMLParser()
feed('The Lorem Ipsum'
“Lorem ipsum door sit amet.”
'单击“下一步”进入下一部分。'
“马上就来!谢谢。”)
你看过BeautifulSoup吗?你想为打印什么我呢
?beautifulsoup可能是一个更好的选择,原因之一是它更能原谅凌乱的html。例如,一个html文档可能忘记关闭一个
标记,这可能会让依赖于end标记的状态机无法停止打印数据而感到困惑。您看过BeautifulSoup吗?你想为打印什么我呢
?beautifulsoup可能是一个更好的选择,原因之一是它更能原谅凌乱的html。例如,一个html文档可能忘记关闭一个
标记,这会使依赖于end标记的状态机无法停止打印数据。是的,我只是在看你的解决方案。我不确定如何处理子元素。也许这应该是一个计数来处理p中的p。顺便说一句,检查“P”和“P”,我想我更喜欢你的解决方案。我问过OP关于嵌套元素的问题。我的答案处理
和
这两个问题。@J.F.Sebastian我看到如果标记=='p':
。HtmlPasser是否使用小写标记?html标记名不是大小写-sensitive@J.F.Sebastian-对,这就是为什么我两个都检查了。原来HTMLPasser的标签是小写的。@J.F.Sebastian是的,我只是在看你的解决方案。我不确定如何处理子元素。也许这应该是一个计数来处理p中的p。顺便说一句,检查“P”和“P”,我想我更喜欢你的解决方案。我问过OP关于嵌套元素的问题。我的答案处理
和
这两个问题。@J.F.Sebastian我看到如果标记=='p':
。HtmlPasser是否使用小写标记?html标记名不是大小写-sensitive@J.F.Sebastian-对,这就是为什么我两个都检查了。事实证明,HTMLParser对标记使用小写。