仅选择div标签内的文本
我正在用urllib做一个网页解析器。我需要只保存某个div标签内的内容。比如说,我想保存“body”这个div里的所有文本。这意味着只要在这个div标签里的文本都会被返回。如果里面还有其他的div也没关系,但一旦碰到父级div就停止了。有没有什么好主意?
我的想法
先找到你想要的那个div。
记录下它的位置。
之后要注意以后的div。新遇到一个div就加1,遇到结束的div就减1。
当计数回到0时,说明你回到了父级div?这时就保存位置。
然后就可以保存从开始位置到结束位置的数据了?
3 个回答
0
我个人一般更喜欢用lxml这个库,但有时候它处理HTML的方式会有点问题……如果有帮助的话,这里有一个使用BeautifulSoup的例子。
from BeautifulSoup import BeautifulSoup, NavigableString
def printText(tags):
s = []
for tag in tags :
if tag.__class__ == NavigableString :
s.append(tag)
else :
s.append(printText(tag))
return "".join(s)
html = "<html><p>Para 1<div class='stuff'>Div Lead<p>Para 2<blockquote>Quote 1</div><blockquote>Quote 2"
soup = BeautifulSoup(html)
v = soup.find('div', attrs={ 'class': 'stuff'})
print v.text_content
3
使用 lxml 库:
import lxml.html as lh
content='''\
<body>
<div>AAAA
<div>BBBB
<div>CCCC
</div>DDDD
</div>EEEE
</div>FFFF
</body>
'''
doc=lh.document_fromstring(content)
div=doc.xpath('./body/div')[0]
print(div.text_content())
# AAAA
# BBBB
# CCCC
# DDDD
# EEEE
div=doc.xpath('./body/div/div')[0]
print(div.text_content())
# BBBB
# CCCC
# DDDD
3
如果你对自己解析HTML代码这件事没什么兴趣,实际上有两个不错的选择:
你可能会发现lxml的运行速度比Beautiful Soup快,但在我使用的过程中,Beautiful Soup非常容易上手,能够很好地处理那些在网上常见的糟糕HTML,所以我觉得不需要其他工具。
每个人的体验可能会有所不同。