2

我正在尝试编写我的第一个 python 脚本。我想编写一个从网站获取信息的程序。

我设法打开网站,读取所有数据并将数据从字节转换为字符串。

import urllib.request

response = urllib.request.urlopen('http://www.imdb.com/title/tt0413573/episodes?season=10')
website = response.read()
response.close()

html = website.decode("utf-8")

print(type(html))
print(html)

字符串很大,我不知道我是将它转换为列表并遍历列表还是将其保留为字符串。

airdate如果找到所有关键字并且他们得到字符串中的下一行,我想做什么。

当我滚动字符串时,这是相关位:

<meta itemprop="episodeNumber" content="10"/>
<div class="airdate">
  Nov. 21, 2013
</div>

这在字符串中发生了很多次。我想要做的是遍历字符串并返回这个结果:

"episodeNumber" = some number
"airdate" = what ever date

对于超时,这发生在字符串中。我试过了:

keywords = ["airdate","episodeNumber"]
for i in keywords:
    if i in html:
        print (something)

我希望我以正确的方式解释自己。如果需要,我将编辑问题。

4

3 回答 3

1

在处理诸如 HTML/XML 之类的结构化文本时,最好使用利用这种结构的现有工具。这提供了一个更可靠和可读的解决方案,而不是使用正则表达式或手动搜索。在这种情况下,我建议安装lxml来解析 HTML。

将此原则应用于您的问题,尝试以下操作(我假设您使用 Python 3,因为您导入了 urllib.request):

import lxml.html as html
import urllib.request

resp = urllib.request.urlopen('http://www.imdb.com/title/tt0413573/episodes?season=10')

fragment = html.fromstring(resp.read())

for info in fragment.find_class('info'):
    print('"episodeNumber" = ', info.find('meta').attrib['content'])
    print('"airdate" =', info.find_class('airdate')[0].text_content().strip())

为了确保剧集编号和播出日期是对应的,我搜索了周围的元素(一个带有“info”类的 div),然后提取你想要的数据。

我确信可以通过更精美的元素选择使代码更漂亮,但这应该可以帮助您入门。


[添加了有关 HTML 结构的解决方案的更多信息。]

包含一集数据的字符串如下所示:

<div class="info" itemprop="episodes" itemscope itemtype="...">
  <meta itemprop="episodeNumber" content="1"/>
  <div class="airdate">Sep. 26, 2013</div> <!-- already stripped whitespace -->
  <strong>
    <a href="/title/tt2911802/" title="Seal Our Fate" itemprop="name">...</a>
  </strong>
  <div class="item_description" itemprop="description">...</div>
  <div class="popoverContainer"></div>
  <div class="popoverContainer"></div>
</div>

您首先通过其类“信息”选择包含一集所有数据的 div。您想要的第一个信息是 div.info 元素的子元素,即元元素,存储在其属性“内容”中。

接下来,您希望将信息存储在 div.airdate 元素中,这次它以文本形式存储在元素内部。为了摆脱它周围的空白,我使用了 strip() 方法。

于 2013-11-02T16:28:24.950 回答
0

如果那是你的第一个 Python 脚本,那么看到你到目前为止所做的真的令人印象深刻。

您将使用一些合法的解析器来帮助您进行解析。

看看BeautifulSoup4

# intellectual property belongs to imdb    
import urllib2
from bs4 import BeautifulSoup

# get the SOUP: tree structure out of the HTML page
soup = BeautifulSoup(urllib2.urlopen("http://www.imdb.com/title/tt0413573/episodes?season=10"))

result = {}
for div in soup.find_all("div", {"class":"airdate"}):
    # get the date and number and store in a dictionary
    date = div.text.encode('utf-8').strip()
    number = div.find_previous_sibling()['content']
    result[number] = date

print result

输出

{'10': 'Nov. 21, 2013', '1': 'Sep. 26, 2013', '3': 'Oct. 3, 2013', '2': 'Sep. 26, 2013', '5': 'Oct. 17, 2013', '4': 'Oct. 10, 2013', '7': 'Oct. 31, 2013', '6': 'Oct. 24, 2013', '9': 'Nov. 14, 2013', '8': 'Nov. 7, 2013'}

让我知道我是否正确理解并回答了您的问题。

于 2013-11-02T17:31:18.587 回答
0

那行得通吗?

lines = website.splitlines()
lines.append('')
for index, line in enumerate(lines):
    for keyword in ["airdate","episodeNumber"]:
        if keyword in line:
            print(lines[index + 1])

如果在该行中找到关键字,它将打印下一行。

于 2013-11-02T15:23:10.553 回答