-1

我正在尝试在 Python 中编写一个 HTML 解析器,该解析器将 URL 或 URL 列表作为其输入,并以以下格式输出有关每个 URL 的特定数据:

网址:数据1:数据2

可以在每个 URL 的完全相同的 HTML 节点中找到数据点。它们始终位于相同的起始标签和结束标签之间。如果有人愿意帮助业余 python 程序员完成工作,将不胜感激。如果您能想出一种方法来输出可以轻松复制并粘贴到excel文档中以供后续数据分析的信息,则加分!

例如,假设我想输出特定 YouTube 视频的观看次数。对于 URL http://www.youtube.com/watch?v=QOdW1OuZ1U0,观看次数约为 360 万。对于所有 YouTube 视频,此编号以以下格式在页面源中找到:

<span class="watch-view-count ">
    3,595,057
</span>

幸运的是,这些确切的标签只能在特定的 YouTube 视频页面上找到一次。这些开始和结束标记可以输入到程序中,也可以在必要时内置并修改。该程序的输出将是:

http://www.youtube.com/watch?v=QOdW1OuZ1U0:3,595,057(或 3595057)。

4

2 回答 2

1
import urllib2
from bs4 import BeautifulSoup

url = 'http://www.youtube.com/watch?v=QOdW1OuZ1U0'
f = urllib2.urlopen(url)
data = f.read()

soup = BeautifulSoup(data)
span = soup.find('span', attrs={'class':'watch-view-count'})
print '{}:{}'.format(url, span.text)

如果不想使用BeautifulSoup,可以使用re

import urllib2
import re

url = 'http://www.youtube.com/watch?v=QOdW1OuZ1U0'
f = urllib2.urlopen(url)
data = f.read()

pattern = re.compile('<span class="watch-view-count.*?([\d,]+).*?</span>', re.DOTALL)
r = pattern.search(data)
print '{}:{}'.format(url, r.group(1))

至于输出,我认为您可以将它们存储在 csv 文件中。

于 2013-07-10T18:12:32.017 回答
0

我更喜欢HTMLParser这种re类型的任务。但是,HTMLParser可能有点棘手。我使用不可变对象来存储数据......我确信这是错误的做法。但它过去曾为我处理过几个项目。

import urllib2
from HTMLParser import HTMLParser
import csv 

position = []
results = [""]

class hp(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag == 'span' and ('class', 'watch-view-count ') in attrs:   
            position.append('bingo')

    def handle_endtag(self, tag):
        if tag == 'span' and 'bingo' in position:
            position.remove('bingo')

    def handle_data(self, data):
        if 'bingo' in position:
            results[0] += " " + data.strip() + " "


my_pages = ["http://www.youtube.com/watch?v=QOdW1OuZ1U0"]
data = []
for url in my_pages:
    response = urllib2.urlopen(url)
    page = str(response.read())
    parser = hp()
    parser.feed(page)
    data.append(results[0])

    # reinitialize immutiable objects
    position = []
    results = [""]

index = 0
with open('/path/to/test.csv', 'wb') as f:
    writer = csv.writer(f)
    header = ['url', 'output']
    writer.writerow(header)
    for d in data:
        row = [my_pages[index], data[index]]
        writer.writerow(row)
        index += 1

然后只需在 Excel 中打开 /path/to/test.csv

于 2013-07-10T18:54:26.833 回答