仅选择div标签内的文本

0 投票
3 回答
2002 浏览
提问于 2025-04-16 06:06

我正在用urllib做一个网页解析器。我需要只保存某个div标签内的内容。比如说,我想保存“body”这个div里的所有文本。这意味着只要在这个div标签里的文本都会被返回。如果里面还有其他的div也没关系,但一旦碰到父级div就停止了。有没有什么好主意?

我的想法

  1. 先找到你想要的那个div。

  2. 记录下它的位置。

  3. 之后要注意以后的div。新遇到一个div就加1,遇到结束的div就减1。

  4. 当计数回到0时,说明你回到了父级div?这时就保存位置。

  5. 然后就可以保存从开始位置到结束位置的数据了?

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代码这件事没什么兴趣,实际上有两个不错的选择:

Beautiful Soup

Lxml

你可能会发现lxml的运行速度比Beautiful Soup快,但在我使用的过程中,Beautiful Soup非常容易上手,能够很好地处理那些在网上常见的糟糕HTML,所以我觉得不需要其他工具。

每个人的体验可能会有所不同。

撰写回答