【问题标题】:Python - Writing all text file contents for specified years from a html web urlPython - 从 html web url 写入指定年份的所有文本文件内容
【发布时间】:2021-01-13 01:52:55
【问题描述】:

我有一个网页,其中包含多个指向文本文件的链接,这些文本文件的标签如下:“2013 年 7 月 6 日,星期六”,其中包含指向以 *_130706.txt 结尾的文件的超链接。有人可以指导我使用将标签中包含 2013 的文件的所有内容写入文本文件的脚本吗?文本文件位于标签中。到目前为止,我已经能够以 xml 格式输出 html:

from lxml import html

from bs4 import BeautifulSoup

import urllib




string = '2013'

my_url = 'url'

html = urllib.request.urlopen(my_url).read()

html_page = BeautifulSoup(html, features='lxml')

有什么建议吗?

【问题讨论】:

  • 请提供更多细节?喜欢网站的图片和html代码吗?
  • 超链接嵌入到标签中。我基本上希望将 2012/2013 文件的所有内容写入单个文本文件。
  • 好的,我明白了,我会尽力给你答复

标签: python url urllib


【解决方案1】:

我的解决办法是

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup

if __name__ == "__main__":
    headers = {
        "Host": "web.mta.info",
        "Connection": "keep-alive",
        "Pragma": "no-cache",
        "Cache-Control": "no-cache",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/87.0.4280.88 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,"
                  "application/signed-exchange;v=b3;q=0.9",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
        "Cookie": "_ga=GA1.2.941711768.1610503542; _gid=GA1.2.1497562578.1610503542; "
                  "cookie_session=!AnxZS989I2WWEppONIhq3dHOsu/4VyPMB2uUQ7VhQ58NbigvNqrV3gdJ3wNP/qYFl3l5MCbT0vDDeP"
                  "+C3j5QyQ8/JwL1WYLBgiBYr59v "
    }
    r = requests.get('http://web.mta.info/developers/turnstile.html', headers)
    r.raise_for_status()
    html = r.text
    soup = BeautifulSoup(html, "html5lib")
    result = ""
    for k in soup.find_all('a'):
        if str(k.string).endswith("2013"):
            # all<a> in 2013
            url = k["href"]
            r2 = requests.get("http://web.mta.info/developers/" + url, headers)
            r2.raise_for_status()
            result += r2.text
    # do some os
    print(result)

【讨论】:

【解决方案2】:

你知道所有这些文件的内容有点……巨大吗?
这是一个没有外部库的python3解决方案,使用正则表达式查找链接:

from urllib import request
import re
import os

strings = ['2013', '2014']
output = 'huge.txt'

my_url = 'http://web.mta.info/developers/turnstile.html'
path, page = os.path.split(my_url)
print("path:", path, "page:", page)

html = request.urlopen(my_url).read().decode("utf8")
urls = []
for string in strings:
  urls += [ u for u in re.findall(r'<a href="([^"]+)">([^<]+)</a>', html)
    if u[1].find(string) >= 0 ]

print("links found:", len(urls))
open(output,"wt").write("")

for url in urls:
  #link = os.path.join(path, url[0])
  link = path + "/" + url[0]
  print ("  link:", link, "  name:", url[1])
  open(output, "at").write ( request.urlopen(link).read().decode("utf8") )

【讨论】:

  • 您好,感谢您的建议。我在这里收到一条错误消息:“HTTP 错误 404:未找到”它确实输出了这个:路径:web.mta.info/developers 页面:turnstile.html 找到的链接:104 链接:web.mta.info/developers\data/nyct/turnstile/ turnstile_131228.txt 名称:2013 年 12 月 28 日,星期六
  • 好吧,看来 Windows 的 path.join 链接错误...已修复
  • 我需要做些什么来打印这个输出吗?我最终希望获取输出文件并将其输入数据框以对其进行操作。看起来输出是字符串类型。想做这样的事情:df = pd.read_csv(output)
  • 这段代码将所有文本页面写入一个名为“huge.txt”的大文件中,该文件变得非常庞大。它是文本文件类型。这也是我独立写每一页的原因。以确保它适合 RAM 并且不滞后。您可以将文本页面直接提供给 pandas 的 pd.DataFrame() 函数。但是调用 df=pd.read_csv('huge.txt') 或 df=pd.read_csv(output) 也应该有效。对于这数百兆字节的文件,缓存到文件根本不是一个坏主意。您可以在调用 html=request.urlopen(...) 之前使用 if(os.path.exists(output)) 检查“huge.txt”是否存在。
猜你喜欢
  • 2019-07-22
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 2021-12-09
  • 2021-03-04
相关资源
最近更新 更多