从URL中查找字符串中所有匹配的单词

时间:2013-11-01 22:47:00

标签: python python-3.x

我正在尝试编写我的第一个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)

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

3 个答案:

答案 0 :(得分: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())

为了确保剧集编号和airdate是对应的,我搜索周围的元素(带有'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元素的子元素,元素元素存储在其属性“content”中。

接下来,您需要存储在div.airdate元素中的信息,这次它作为文本存储在元素中。为了摆脱它周围的空白,我然后使用了strip()方法。

答案 1 :(得分: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])

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

答案 2 :(得分: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'}

如果我理解并正确回答了您的问题,请告诉我。