原文: https://pythonspot.com/http-parse-html-and-xhtml

在本文中,您将学习如何解析网站的 HTML(超文本标记语言)。 有几个 Python 库可以实现这一目标。 我们将演示一些流行的例子。

Beautiful Soup:用于解析 HTML 和 XML 的 python 包

该库非常流行,甚至可以处理格式错误的标记。 要获取单个div的内容,可以使用以下代码:

  1. from BeautifulSoup import BeautifulSoup
  2. import urllib2
  3. # get the contents
  4. response = urllib2.urlopen('https://en.wikipedia.org/wiki/Python_(programming_language)')
  5. html = response.read()
  6. parsed_html = BeautifulSoup(html)
  7. print parsed_html.body.find('div', attrs={'class':'toc'})

这将输出 Wikipedia 文章中称为“toc”(目录)的div中的 HTML 代码。 如果只希望使用原始文本,请使用:

  1. print parsed_html.body.find('div', attrs={'class':'toc'}).text

如果要获取页面标题,则需要从标题部分获取:

  1. print parsed_html.head.find('title').text

要从网站获取所有图像 URL,可以使用以下代码:

  1. from BeautifulSoup import BeautifulSoup
  2. import urllib2
  3. url = 'https://www.arstechnica.com/'
  4. data = urllib2.urlopen(url).read()
  5. soup = BeautifulSoup(data)
  6. links = soup.findAll('img', src=True)
  7. for link in links:
  8. print(link["src"])

要从网页中获取所有 URL,请使用以下命令:

  1. from BeautifulSoup import BeautifulSoup
  2. import urllib2
  3. url = 'https://www.arstechnica.com/'
  4. data = urllib2.urlopen(url).read()
  5. soup = BeautifulSoup(data)
  6. links = soup.findAll('a')
  7. for link in links:
  8. print(link["href"])

PyQuery:一个类似 jquery 的 Python 库

要从标记中提取数据,我们可以使用 PyQuery。 它可以根据您的需要获取实际的文本内容和 html 内容。 要获取标签,请使用调用pq('tag')

  1. from pyquery import PyQuery
  2. import urllib2
  3. response = urllib2.urlopen('https://en.wikipedia.org/wiki/Python_(programming_language)')
  4. html = response.read()
  5. pq = PyQuery(html)
  6. tag = pq('div#toc')
  7. # print the text of the div
  8. print tag.text()
  9. # print the html of the div
  10. print tag.html()

要获得标题,只需使用:

  1. tag = pq('title')

HTMLParser:简单的 HTML 和 XHTML 解析器

该库的用法非常不同。 使用此库,您必须将所有逻辑都放在WebParser类中。 用法的基本示例如下:

  1. from HTMLParser import HTMLParser
  2. import urllib2
  3. # create parse
  4. class WebParser(HTMLParser):
  5. def handle_starttag(self, tag, attrs):
  6. print "Tag: " + tag
  7. # get the contents
  8. response = urllib2.urlopen('https://en.wikipedia.org/wiki/Python_(programming_language)')
  9. html = response.read()
  10. # instantiate the parser and fed it some HTML
  11. parser = WebParser()
  12. parser.feed(html)