【问题标题】:Python scraping from a txt web-pagePython 从 txt 网页中抓取
【发布时间】:2017-02-15 11:06:34
【问题描述】:

我有一个来自网站的大 txt 文件 https://en90.tribalwars.net/map/village.txt

这些是前几行:

1,Barbarian+village,508,538,10342642,4208,0

2,ckouta+village,507,542,11001011,9761,0

3,Bonus+village,464,449,0,1513,1

4,Revenge+Will+Be+Sweet,501,532,9202536,9835,0

5,OFF,515,501,11158923,5644,0

我现在想从与给定的第三和第四列匹配的行中提取第一个数字。例如:假设我正在寻找 x = 464 和 y = 449,我希望我的脚本返回 3。

我尝试使用 beautifulsoup 解析 html 页面,然后使用正则表达式匹配正确的行,但我无法完成这项工作。

【问题讨论】:

  • 你不需要BeautifulSoup
  • 我建议将页面中的值转换为 csv 文件格式(逗号分隔值),它看起来像 btw 然后按列与 csv 编辑器或 python 包匹配,不需要美丽的汤

标签: python regex beautifulsoup


【解决方案1】:

你可以在re模块中使用方括号和groups()

以下代码将使您能够访问第 1、第 3 和第 4 个号码。

import re
pattern = r'(.+),.+,(.+),(.+),.+,.+,.+'
string = '3,Bonus+village,464,449,0,1513,1'
foo = re.match(pattern, string).groups()
print(foo)

这让您只需将 foo 的第二个与“464”进行比较,将 foo 的第三个与“449”进行比较。


我看到一个 cmets 推荐使用 csv,我相信这是一个非常合理的想法。相当于使用 csv 可以通过使用 string.split(',')

【讨论】:

  • 谢谢!有了你提供的模式和一些小的调整,我现在已经可以工作了:)
  • 代码 sn-p 中缺少一个字符(第 3 行的右引号)。我无法编辑,因为一次编辑至少需要更改 6 个字符,而这只是一个。
  • 感谢您告诉我。我在第 3 行补上了缺失的结束语。
【解决方案2】:

在这种特殊情况下,我不会使用正则表达式。此数据看起来像 CSV 数据(逗号分隔值)并且非常一致。

我的建议:

from urllib import urlopen
from collections import namedtuple

text = 'https://en90.tribalwars.net/map/village.txt'
content = urlopen(text).read()
lines = content.split('\n')[0:-1]    # last character is an empty string

village = namedtuple('village', ['id', 'name', 'x', 'y', 'z', 'whatever'])

def create_item(line):
    item = village(
        id=line.split(',')[0],
        name=line.split(',')[1],
        x=line.split(',')[2],
        y=line.split(',')[3],
        z=line.split(',')[4],
        whatever=line.split(',')[5]
    )
    return item

lines = [create_item(line) for line in lines]

sample = lines[0]
print sample.id
print sample.name 
print sample.x      # 512
print sample.y      # 529

我也添加了一个命名元组以使其更酷。这些行包含所有数据,您应该能够编写一个函数来根据 x 和 y 值进行过滤。

【讨论】:

    猜你喜欢
    • 2014-10-30
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多