Чтение веб-страниц с помощью Python - PullRequest
0 голосов
/ 09 августа 2010

Я пытаюсь прочитать и обработать веб-страницу на 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 ]

2 голосов
/ 09 августа 2010

Учитывая небольшой фрагмент HTML, я не знаю, будет ли это эффективно на полной странице, но вот как извлечь «AC / DC» и «Live», используя lxml.etree и xpath.

>>> from lxml import etree
>>> doc = etree.HTML("""<html>
... <head></head>
... <body>
... <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">
... </tr>
... </body>
... </html>
... """)
>>> doc.xpath('//td[@class="or_q_artist"]/a/text()|//td[@class="or_q_album"]/a/text()')
['AC/DC', 'Live']
0 голосов
/ 10 августа 2010
  1. Посмотрите, можете ли вы решить проблему в javascript, используя селекторы DOM / CSS в стиле jQuery, чтобы получить нужные элементы / текст.
  2. Если вы сможете получить копию BeautifulSoup для python, и вам будет полезно отправиться в считанные минуты.
...