如何在Python中获取HTML页面的内容

4

我已经将网页下载为一个html文件。我想知道获取该页面内容的最简单方法是什么。所谓内容,指的是浏览器显示的字符串。

明确一下:

输入:

<html><head><title>Page title</title></head>
       <body><p id="firstpara" align="center">This is paragraph <b>one</b>.
       <p id="secondpara" align="blah">This is paragraph <b>two</b>.
       </html>

输出:

Page title This is paragraph one. This is paragraph two.

组合在一起:
from BeautifulSoup import BeautifulSoup
import re

def removeHtmlTags(page):
    p = re.compile(r'''<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>''')
    return p.sub('', page)

def removeHtmlTags2(page):
    soup = BeautifulSoup(page)
    return ''.join(soup.findAll(text=True))

相关


你在说哪些标签?能具体一点吗? - SilentGhost
<html> <head> 是标签。我不需要它们,我需要一个在浏览器上显示的实际字符串。 - Yin Zhu
为什么输出中的点消失了? - SilentGhost
6个回答

12

使用Beautiful Soup解析HTML。

要获取所有文本,不包括标签,请尝试:

''.join(soup.findAll(text=True))

http://www.crummy.com/software/BeautifulSoup/documentation.html 我没有看到renderContents()函数在这里起作用。我想删除这些标签。 - Yin Zhu
@Yin Zhu - 啊,renderContents只对子部分起作用,而不是整个文档。我用了从文档中提取的技巧来替换它。 - Oddthinking
@Yin Zhu:在所引用的文档中,“renderContents”出现了6次。请使用支持页面搜索的网络浏览器。 - S.Lott

9

个人而言,我使用lxml是因为它是一把瑞士军刀...

from lxml import html

print html.parse('http://someurl.at.domain').xpath('//body')[0].text_content()

这告诉lxml去获取页面,定位<body>标签然后提取并打印所有文本。

我经常进行页面解析,正则表达式大多数情况下都不是正确的解决方案,除非只需解析一次。如果页面的作者更改了他们的HTML,您的正则表达式很可能会出现错误。解析器更有可能继续工作。

解析器的一个大问题是学习如何访问您需要的文档部分,但是浏览器内有许多XPATH工具可以简化该任务。


2

1
链接已经失效。 - winklerrr

1

这个任务最好的模块是lxml或html5lib;在我看来,Beautifull Soap已经不值得使用了。对于递归模型,正则表达式绝对是错误的方法。


你能否解释一下为什么Beautiful Soup不再值得使用了吗? - Oddthinking
1
赞同。HTML 有什么变化使得 Beautiful Soup 不再适用?它可以抽象出许多与不完美的 HTML 相关的问题。 - Tom

-2
如果我理解你的问题正确,这可以通过使用urllib的urlopen函数来简单完成。只需查看此函数以打开URL并读取响应,该响应将是该页面的HTML代码。

你没有理解对,OP说:“我已经将网页下载到一个HTML文件中了。” - SilentGhost

-3

获取浏览器显示内容的最快方法是从HTML中删除所有标签并打印剩余部分。例如,可以使用Python的re模块来实现。


3
无法使用正则表达式完成此操作。请不要让人们感到困惑。 - SilentGhost
请解释一下。我不是在谈论完美的解决方案,只是想找到一种粗略的方法来获得可接受质量的内容(我知道这种方法有限)。删除标签只需要查找<..></..>,那么为什么不能使用正则表达式呢? - Alexander Gessler
2
https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - SilentGhost
现在你有两个问题。 - Oddthinking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接