用Python阅读网页

时间:2010-08-09 15:13:21

标签: python libxml2

我正在尝试阅读和处理Python中的网页,其中包含以下内容:

              <div class="or_q_tagcloud" id="tag1611"></div></td></tr><tr><td class="or_q_artist"><a title="[Artist916]" href="http://rateyourmusic.com/artist/ac_dc" class="artist">AC/DC</a></td><td class="or_q_album"><a title="[Album374717]" href="http://rateyourmusic.com/release/album/ac_dc/live_f5/" class="album">Live</a></td><td class="or_q_rating" id="rating374717">4.0</td><td class="or_q_ownership" id="ownership374717">CD</td><td class="or_q_tags_td">

我目前只对艺术家姓名(AC / DC)和专辑名称(Live)感兴趣。我可以用libxml2dom读取和打印它们,但我无法弄清楚如何区分链接,因为每个链接的节点值都是None。

一种显而易见的方法是一次读取输入行,但有一种更聪明的方法来处理这个html文件,以便我可以创建两个单独的列表,其中每个索引匹配另一个或具有此信息的结构?

import urllib
import sgmllib
import libxml2dom

def collect_text(node):
  "A function which collects text inside 'node', returning that text."

  s = ""
  for child_node in node.childNodes:
    if child_node.nodeType == child_node.TEXT_NODE:
        s += child_node.nodeValue
    else:
        s += collect_text(child_node)
  return s

  f = urllib.urlopen("/home/x/Documents/rym_list.html")

  s = f.read()

  doc = libxml2dom.parseString(s, html=1)

  links = doc.getElementsByTagName("a")
  for link in links:
    print "--\nNode " , artist.childNodes
    if artist.localName == "artist":
      print "artist"
    print collect_text(artist).encode('utf-8')

  f.close()

2 个答案:

答案 0 :(得分:2)

鉴于HTML的小谣言,我不知道这是否会在整页上有效,但这里是如何使用lxml.etree和{{1}提取“AC / DC”和“实时” }。

xpath

答案 1 :(得分:0)

  1. 看看你是否可以使用jQuery样式的DOM / CSS选择器来解决javascript中的问题,以获得你想要的元素/文本。
  2. 如果你能获得BeautifulSoup for python的副本,你应该在几分钟之内就可以了。