日期格式为必填项RFC 3339 (1970-01-01T00: 00: 00Z)
我这样做了
d = datetime.datetime.now().replace(microsecond=0).isoformat() + "Z"
如何让时间减少 6 小时?
日期格式为必填项RFC 3339 (1970-01-01T00: 00: 00Z)
我这样做了
d = datetime.datetime.now().replace(microsecond=0).isoformat() + "Z"
如何让时间减少 6 小时?
我正在重写一个应用程序并决定用 FirebaseCrashlytics SDK 替换 Crashlytics
完成所有步骤
https://firebase.google.com/docs/crashlytics/get-started?hl=ru&platform=android
应用程序在启动时崩溃
2020-05-07 21:43:01.288 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: .
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . | |
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . | |
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . | |
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . \ | | /
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . \ /
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . \ /
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . \/
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: .
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: The Crashlytics build ID is missing. This occurs when Crashlytics tooling is absent from your app's build configuration. Please review Crashlytics onboarding instructions and ensure you have a valid Crashlytics account.
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: .
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . /\
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . / \
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . / \
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . / | | \
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . | |
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki I/chatty: uid=10080(com.app.peshkariki) identical 1 line
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: . | |
2020-05-07 21:43:01.289 6597-6597/com.app.peshkariki E/FirebaseCrashlytics: .
2020-05-07 21:43:01.294 6597-6597/com.app.peshkariki D/AndroidRuntime: Shutting down VM
2020-05-07 21:43:01.305 6597-6597/com.app.peshkariki E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.peshkariki, PID: 6597
java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.IllegalStateException: The Crashlytics build ID is missing. This occurs when Crashlytics tooling is absent from your app's build configuration. Please review Crashlytics onboarding instructions and ensure you have a valid Crashlytics account.
at android.app.ActivityThread.installProvider(ActivityThread.java:6242)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.IllegalStateException: The Crashlytics build ID is missing. This occurs when Crashlytics tooling is absent from your app's build configuration. Please review Crashlytics onboarding instructions and ensure you have a valid Crashlytics account.
at com.google.firebase.crashlytics.c.g.k.n(com.google.firebase:firebase-crashlytics@@17.0.0:136)
at com.google.firebase.crashlytics.b.b(com.google.firebase:firebase-crashlytics@@17.0.0:78)
at com.google.firebase.crashlytics.CrashlyticsRegistrar.b(com.google.firebase:firebase-crashlytics@@17.0.0:55)
at com.google.firebase.crashlytics.CrashlyticsRegistrar.a(Unknown Source:0)
at com.google.firebase.crashlytics.a.a(Unknown Source:2)
at com.google.firebase.components.l.f(com.google.firebase:firebase-components@@16.0.0:69)
at com.google.firebase.components.i.get(Unknown Source:4)
at com.google.firebase.components.q.get(com.google.firebase:firebase-components@@16.0.0:53)
at com.google.firebase.components.l.e(com.google.firebase:firebase-components@@16.0.0:158)
at com.google.firebase.c.l(com.google.firebase:firebase-common@@19.3.0:563)
at com.google.firebase.c.o(com.google.firebase:firebase-common@@19.3.0:304)
at com.google.firebase.c.n(com.google.firebase:firebase-common@@19.3.0:268)
at com.google.firebase.c.m(com.google.firebase:firebase-common@@19.3.0:253)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(com.google.firebase:firebase-common@@19.3.0:51)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1917)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1892)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(com.google.firebase:firebase-common@@19.3.0:45)
at android.app.ActivityThread.installProvider(ActivityThread.java:6239)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
以前使用的代码
Crashlytics.setUserIdentifier(user.id)
现在Crashlytics.setUserId(user.id)
这个对象在哪里
object Crashlytics {
fun log(e: Error){
FirebaseCrashlytics.getInstance().log(e.printStackTrace().toString())
Log.d("Error даня", e.printStackTrace().toString())
}
fun log(e: Exception){
FirebaseCrashlytics.getInstance().log(e.printStackTrace().toString())
Log.d("Exception даня2", e.printStackTrace().toString())
}
fun log(message: String){
FirebaseCrashlytics.getInstance().log(message)
Log.d("Exception даня3", message)
}
fun setUserId(id: String){
FirebaseCrashlytics.getInstance().setUserId(id)
}
}
还缺少什么?
毕业项目
uildscript {
ext.nav_version = '1.0.0'
repositories {
google()
mavenCentral()
maven { url "https://dl.bintray.com/drummer-aidan/maven/" }
jcenter()
maven { url 'https://jitpack.io' }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.0-alpha08'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0'
}
}
allprojects {
repositories {
google()
maven { url 'https://jitpack.io' }
maven { url "https://dl.bintray.com/drummer-aidan/maven/" }
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
毕业模块
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 29
defaultConfig {
applicationId ""
minSdkVersion 18
targetSdkVersion 29
versionCode 346
versionName "3.2.0"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.incremental":"true"]
}
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buildTypes.each {
it.buildConfigField 'String', 'appMetrica', appMetrica
}
buildFeatures{
// viewBinding = false //новая хуйня, лучше чем синтетика (вроде)
dataBinding = true
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
//Firebase
implementation 'com.google.firebase:firebase-core:17.3.0'
implementation 'com.google.firebase:firebase-messaging:20.1.4'
implementation 'com.google.firebase:firebase-dynamic-links:19.1.0'
implementation 'com.google.firebase:firebase-crashlytics:17.0.0'
implementation 'com.google.firebase:firebase-analytics:17.4.0'
}
apply plugin: 'com.google.gms.google-services'
需要帮助创建单例。
有一个类 - 文件资源管理器。
在片段中,我创建了一个类的实例,如果文件是文件夹,那么在文件资源管理器中,我移动到文件夹级别,片段被简单地重新打开,当前文件夹中的数据应该已经加载
class FileManager(context: Context) {
private lateinit var currentDirectory: File
private var rootDirecory: File
private var instance : FileManager? = null
init {
Log.d("Класс создался", "тут")
val directory: File
if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState())
directory = Environment.getExternalStorageDirectory()
else
directory = ContextCompat.getDataDir(context)!!
rootDirecory = directory
navigateTo(directory)
}
fun navigateTo(directory: File): Boolean {
/**
* Проверяем является ли файл директорией
*/
if (!directory.isDirectory) {
Log.d("FileManager", "${directory.absolutePath} is not a directory!")
return false
}
/**
* Проверим, не поднялись ли мы выше rootDirectory
*/
if ((directory != rootDirecory) && rootDirecory.absolutePath.contains(directory.absolutePath)) {
Log.w(
"FileManager",
"Trying to navigate upper than root directory to " + directory.absolutePath
);
return false
}
currentDirectory = directory
return true
}
fun navigateUp(): Boolean {
return navigateTo(currentDirectory.parentFile!!)
}
fun getFiles(): ArrayList<File> {
val items = ArrayList<File>()
val files = currentDirectory.listFiles()
files?.let {
items.addAll(currentDirectory.listFiles())
}
return items
}
fun getInstance(context: Context): FileManager{
if(instance == null)
instance = FileManager(context)
return instance as FileManager
}
}
我不知道如何将代码从 init 移动到主构造函数,并且由于 Init 始终有效,结果证明这不是单例
而且我还是不喜欢我的调用方式,你需要去掉不必要的参数
fileManager = FileManager(context!!).getInstance(context!!)
分段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
fileManager = FileManager(context!!).getInstance(context!!)
val bundle = this.arguments
fileProviderAdapter = FileProviderAdapter{
if(it.isDirectory){
fileManager.navigateTo(it.absoluteFile)
Log.d("нафигация", it.absoluteFile.toString())
Snackbar.make(getView()!!, "Навигация ${it.name}", Snackbar.LENGTH_LONG)
.show()
loadFragment(FileProviderFragment())
}
else{
Snackbar.make(getView()!!, "Клик по ${it.name}", Snackbar.LENGTH_LONG)
.show()
}
解析时,我遇到了一个问题,它有点冻结。什么都没有发生,没有日志,绝对没有。
CPU 负载和内存消耗不会改变。
现在它在处理了 8000 个链接后冻结了。
我不知道有什么问题。
我认为服务器断开了连接,并且好像请求挂断了。
是否可以以某种方式指定执行请求的时间,例如 30 秒,这样如果这个时间过去了,它会抛出某种错误,以便我可以捕获它并再次执行请求?
我目前正在使用此代码
async def async_request(items):
url = items[0]
global request_semaphone
async with request_semaphone:
try:
async with aiohttp.ClientSession() as client:
async with client.get(url) as r:
print("Статус:", r.status , "url:", url)
if(r.status == 200):
name = url.split("/")[-1]
if(name.find(".jpg") != -1):
await save_image(r, name)
else:
if(len(items) > 1):
return [await r.text(), url, items[1]]
else:
return [await r.text(), url]
else:
print(r.status, "Задержка 1 секунда")
await asyncio.sleep(1)
await async_request(url)
except Exception as e:
print("Блокировка. Ожидание 10 секунд", e, items)
await asyncio.sleep(1)
await async_request(url)
我还将听取为什么 python(或解析器本身)冻结的建议。
解析的时候需要拉出页面中没有的参数之一,但是在js中。
js片
i","brandId":14426,"nomenclatures":{"2217416":{"cod1S":2217416,"ordersCount":700,"artikul":"
需要拉取ordersCount中的值
我首先尝试拉出2个搜索索引text.find(),然后将其从文本中剪掉,但它抛出了-1,即未找到
现在我正在尝试借助正则表达式,但编译它时出现问题。无法弄清楚如何限制左右。
最后一次尝试/^"ordersCount":.\$/
有一条线
2020-01-25T19:27:49.3223932
如何将其转换为方便阅读的形式?例如 2020 年 1 月 25 日
像这样试过
datetime.datetime.strptime(first_comment, '%Y-%m-%dT%H:%M:%S')
有一些搜索请求在其字段中返回包含不同模型的 JSON。
例子
{
"resultCount":13,
"results": [
{"wrapperType":"collection", "collectionType":"Album", "artistId":40876509, "collectionId":259510974, "amgArtistId":310510, "artistName":"D+", "collectionName":"Dandelion Seeds", "collectionCensoredName":"Dandelion Seeds", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/dandelion-seeds/259510974?uo=4", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "collectionExplicitness":"notExplicit", "trackCount":12, "copyright":"℗ 1998 K Records", "country":"USA", "currency":"USD", "releaseDate":"2007-09-04T07:00:00Z", "primaryGenreName":"Alternative"},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511004, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Cut It Out", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Cut It Out", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/cut-it-out/259510974?i=259511004&uo=4", "trackViewUrl":"https://music.apple.com/us/album/cut-it-out/259510974?i=259511004&uo=4",
"previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview71/v4/4e/fc/93/4efc93a5-f3f0-0c7e-ed14-68cb6b6d6fbd/mzaf_5721197462467928771.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":1, "trackTimeMillis":236187, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511045, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Green Party", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Green Party", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/green-party/259510974?i=259511045&uo=4", "trackViewUrl":"https://music.apple.com/us/album/green-party/259510974?i=259511045&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/eb/c7/6a/ebc76a4f-3825-8060-f781-a0f36532f198/mzaf_876283245701275269.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":2, "trackTimeMillis":170587, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511130, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Don't Worry About Me", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Don't Worry About Me", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/dont-worry-about-me/259510974?i=259511130&uo=4", "trackViewUrl":"https://music.apple.com/us/album/dont-worry-about-me/259510974?i=259511130&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/00/79/54/007954d4-c7f7-8900-cf96-1173ca7f608f/mzaf_5029393603193854925.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":3, "trackTimeMillis":227293, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511261, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Dandelion Wine", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Dandelion Wine", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/dandelion-wine/259510974?i=259511261&uo=4", "trackViewUrl":"https://music.apple.com/us/album/dandelion-wine/259510974?i=259511261&uo=4",
"previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview62/v4/bd/42/36/bd423652-c476-10f5-a1f5-383adfa56eb4/mzaf_1251229812831649846.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":4, "trackTimeMillis":231653, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511347, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Profits Are Soaring", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Profits Are Soaring", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/profits-are-soaring/259510974?i=259511347&uo=4", "trackViewUrl":"https://music.apple.com/us/album/profits-are-soaring/259510974?i=259511347&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/35/f3/46/35f34609-4e71-ae71-355b-c6ac72181730/mzaf_5686900859081999102.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":5, "trackTimeMillis":249600, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511409, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"Rusted", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"Rusted", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/rusted/259510974?i=259511409&uo=4", "trackViewUrl":"https://music.apple.com/us/album/rusted/259510974?i=259511409&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music2/v4/8b/33/67/8b336773-9747-cafe-a624-2ea18a8069a6/mzaf_2729424859737659172.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":6, "trackTimeMillis":316987, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511510, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"My Best Day", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"My Best Day", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/my-best-day/259510974?i=259511510&uo=4", "trackViewUrl":"https://music.apple.com/us/album/my-best-day/259510974?i=259511510&uo=4", "previewUrl":"https://audio-ssl.itunes.apple.com/itunes-assets/Music/v4/41/4c/a7/414ca717-b07d-b927-9ffa-8da8a231f2ac/mzaf_3343910103798289777.plus.aac.p.m4a", "artworkUrl30":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/30x30bb.jpg", "artworkUrl60":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/60x60bb.jpg", "artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music/v4/67/d1/18/67d11843-724e-f40b-34ba-f94f087909c3/source/100x100bb.jpg", "collectionPrice":9.99, "trackPrice":0.99, "releaseDate":"1998-08-25T12:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"notExplicit", "discCount":1, "discNumber":1, "trackCount":12, "trackNumber":7, "trackTimeMillis":188480, "country":"USA", "currency":"USD", "primaryGenreName":"Alternative", "isStreamable":true},
{"wrapperType":"track", "kind":"song", "artistId":40876509, "collectionId":259510974, "trackId":259511537, "artistName":"D+", "collectionName":"Dandelion Seeds", "trackName":"His Heels", "collectionCensoredName":"Dandelion Seeds", "trackCensoredName":"His Heels", "artistViewUrl":"https://music.apple.com/us/artist/d/40876509?uo=4", "collectionViewUrl":"https://music.apple.com/us/album/his-heels/259510974?i=259511537&uo=4", "trackViewUrl":"https://music.apple.com/us/album/his-heels/259510974?i=259511537&uo=4",
这种情况下如何发送请求,后面又如何解析呢?
fun getAlbumAndSongs(
@Query("id") collectionId : Long,
@Query("entity") entity: String = "songs"
) : Response<BaseResponse<T>>
用什么来代替T?我不能指定 2 个不同的型号?
data class BaseResponse<T>(
val resultCount : Int,
val results : List<T>
)
更新
val baseEntity = body.results.map {
gson.fromJson(it.toString(), BaseEntity::class.java)
}
因错误而崩溃
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 142 path $.collectionName
在 Excel 中保存数据时,记录的索引从 0 开始
pd.DataFrame(products).to_excel(config["output_filename"], index=True)
有没有办法从1开始索引?
该网站上的 javascript 包含一些 Json,我使用正则表达式将其提取出来。
但是 Json 包含 html 元素。有没有办法摆脱它们,只留下文字?
例如
<div>Гарантированный анализ:</b> протеин 0,0014%, жиры 0,00029%, зола 5,3%, влага 81%, кальций 5,2%, калий 0,026%, магний 0,000014%, натрий 0,000047%, фосфор 0,0011%.</div><div style="text-align: justify;"><b>Состав: </b>минералы, сахар, молоко и молочные продукты, концентрат черной смородины.</div><div style="text-align: justify;"> </div><div style="text-align: justify;"><b>Гарантированный анализ:</b> протеин 0,0014%, жиры 0,00029%, зола 5,3%, влага 81%, кальций 5,2%, калий 0,026%, магний 0,000014%, натрий 0,000047%, фосфор 0,0011%.</div><div style="text-align: justify;"> </div><div style="text-align: justify;"><b>Добавки на 1 л:</b> витамин С 200 мг.</div>
更新:这些方法不适用于此:
\r\n\u003cul>\r\n \u003cli style=\"text-align: justify;\">Полноценный корм в виде хлопьев с натуральными усилителями цвета\u003c/li>
更新 如果您将 bs4 打印到控制台,它会打印
Результат:
Полноценный корм в виде хлопьев с натуральными усилителями цвета
Поддерживает яркость и полноту окраса всех видов красных, оранжевых и желтых декоративных рыб
Эффект усиления цвета виден всего через две недели
БиоАктив-формула поддерживает здоровой иммунную систему
Содержит пребиотики для лучшего переваривания пищи
Для здорового роста рыб и чистой воды
一切都很好,但是如果我将值输入字典,然后显示该字典,那么特殊字符会从我身上溜走
{'composition': 'Ингредиенты:\xa0рыба и побочные рыбные продукты, зерновые культуры, дрожжи, моллюски и раки, экстракты растительного белка, масла и жиры, водоросли, сахар (олигофруктоза 0,9%), минеральные вещества.\n\n\n\nАналитический состав:\n\n\
我已经解析了一些数据,现在我需要将数据从 dict 转换为 dataframe。我不是熊猫的朋友,所以希望能得到你的帮助
df = pd.DataFrame(text)
print(df)
不知何故不清楚
0 {'film_name': '21 мост', 'film_genres': ['боев...
1 {'film_name': 'FORD против FERRARI', 'film_gen...
2 {'film_name': 'Аббатство Даунтон', 'film_genre...
3 {'film_name': 'Арахисовый сокол', 'film_genres...
4 {'film_name': 'Война токов', 'film_genres': ['...
5 {'film_name': 'Давай разведемся', 'film_genres...
text:
{
'filmes': [
{
'film_name': '21 мост',
'film_genres': ['боевик', 'триллер'],
'cinames': [
{
'cinema': 'Nescafe-IMAX',
'sessions': [
{
'time': '23:55',
'price': '190 ₽',
'format': '2D'
}
]
},
{
'cinema': 'Каро 13 Кунцево',
'sessions': [
{
'time': '23:25',
'price': '430 ₽',
'format': '2D'
}
]
},
{
'cinema': 'Каро 8 Теплый Стан',
'sessions': [
{
'time': '23:25',
'price': '350 ₽',
'format': '2D'
}
]
},
{
'cinema': 'Киномакс Мозаика',
'sessions': [
{
'time': '23:50',
'price': '290 ₽',
'format': '2D'
}
]
},
]
}
]
}
我想将dict保存到json。
我这样保存:
def save_json(json_text, output_filename):
with open(output_filename, 'w') as outfile:
outfile.write(json_text)
西里尔文形式的代码在文件中。像这样试过
def save_json(json_text, output_filename):
with open(output_filename, 'w') as outfile:
json.dump(json_text, outfile, ensure_ascii=False)
引发 AttributeError:'dict' 对象没有属性 'dump',已删除、重命名,现在最后一个选项返回
UnicodeEncodeError: 'charmap' codec can't encode character '\u20bd' in position 5: character maps to <undefined>
我需要按升序对列表进行排序。作为排序参数,你必须指定每个item被某个参数拆分后的列表长度 split("paramater")
def sorted(items):
return sorted(items, key = )
入口:
0.2090000.ru
0.fls.doubleclick.net
0.hiveon.net
0.internet.org
0.r.bat.bing.com
0.r.msn.com
出口:
0.2090000.ru - 3
0.hiveon.net - 3
0.internet.org - 3
0.fls.doubleclick.net - 4
0.r.msn.com - 4
0.r.bat.bing.com - 5
在键中指定什么?如何在items中引用item?
我有一个这样的excel电子表格:
группа запрос ..... длстр
0 1 2 3 4 5 6 63
0 1 2 3 4 5 55
0 1 2 3 4 5 6 55
0 1 2 3 4 46
0 1 2 3 4 45
0 1 2 3 4 45
1 1 2 3 4 5 6 80
..
有一些组(在示例中此组为 0)
Среди группы необходимо получить только одну строку.
Условие выборки:
Если количество слов в столбце запрос = 5 выбираем, иначе
Если количество слов в столбце запрос = 6 выбираем, иначе если количество слов в столбце запрос равен 4 выбираем
Дополнительно, если встречаются несколько 5, 6 или 4, то нужно выбрать ту строчку, где значение в столбце длст ("G" в Excel) больше
在我们的例子中,输出线是
группа запрос ..... длстр
0 1 2 3 4 5 55
康
группа;Запрос;Позиция;Базовая частотность;Очень точная частотность;Количество слов;длстр
1;основные принципы демократического избирательного права таблица;47;12;12;6;63
1;основные принципы демократического избирательного права;39;148;14;5;55
1;порядок подачи жалобы на административное постановление;48;81;3;6;55
1;принципы демократического избирательного права;43;569;92;4;46
1;демократические принципы избирательного права;43;569;19;4;45
1;принцип демократического избирательного права;28;569;10;4;45
1;основные принципы избирательного права;45;745;111;4;38
1;принцип гласности избирательного права;50;21;1;4;38
1;принцип прямого избирательного права;50;368;56;4;36
1;принципы избирательного права это;49;285;44;4;33
1;принципы избирательного права;49;8504;1403;3;29
1;принцип избирательного права;38;8585;96;3;28
2;истечение срока давности уголовного преследования;40;553;28;5;49
2;срок давности по уголовным делам средней тяжести;48;46;15;7;48
2;срок исковой давности по уголовным преступлениям;42;30;12;6;48
2;как исчисляется срок давности по уголовным делам;10;19;15;7;48
2;когда истекает срок давности по уголовному делу;46;119;6;7;47
2;как считается срок давности по уголовным делам;6;9;1;7;46
2;срок давности для возбуждения уголовного дела;33;44;4;6;45
2;когда истекает срок давности уголовного дела;32;214;1;6;44
2;исчисление срока давности по уголовным делам;28;12;4;6;44
2;срок давности расследования уголовного дела;5;24;3;5;43
2;факт уголовного преследования срок хранения;35;19;3;5;43
2;что такое срок давности по уголовным делам;17;76;21;7;42
2;какие преступления не имеют срока давности;37;72;21;6;42
2;срок исковой давности в уголовном процессе;52;15;3;6;42
2;сроки исковой давности по уголовным делам;34;543;14;6;41
2;срок давности возбуждения уголовного дела;50;509;7;5;41
2;какой срок давности у тяжких преступлений;47;1;1;6;41
2;истечение срока давности уголовного дела;46;1536;17;5;40
2;срок давности по уголовным преступлениям;50;731;121;5;40
2;срок исковой давности по уголовным делам;36;556;171;6;40
2;срок исковой давности по уголовному делу;31;543;24;6;40
2;с какого момента начинается преступление;26;340;1;5;40
2;есть ли срок давности по уголовным делам;24;289;8;7;40
2;сколько срок давности по уголовным делам;32;52;9;6;40
2;сроки давности уголовного преследования;50;1063;49;4;39
2;какие сроки давности по уголовным делам;24;192;3;6;39
2;прошел срок давности по уголовным делам;28;40;4;6;39
2;какой срок давности по уголовным делам;28;187;12;6;38
2;преступления не имеющие срока давности;47;164;12;5;38
2;сроки преследования по уголовным делам;35;70;2;5;38
2;срок давности преступления сколько лет;49;43;2;5;38
2;срок исковой давности уголовного дела;34;711;18;5;37
2;срок преследования по уголовному делу;48;70;5;5;37
2;какой срок давности у уголовного дела;22;60;5;6;37
2;истечение срока давности преступления;49;11;11;4;37
2;какие статьи не имеют срока давности;39;16;2;6;36
2;исковая давность по уголовным делам;28;630;21;5;35
2;когда истекает срок уголовного дела;27;407;6;5;35
2;какой срок уголовного преследования;50;76;1;4;35
2;какой срок давности у уголовных дел;22;56;27;6;35
2;срок исковой давности по уголовным;37;586;2;5;34
2;срок давности в уголовном процессе;38;65;2;5;34
2;сроки давности по уголовным делам;47;5885;468;5;33
2;сроки давности по уголовному делу;43;5773;19;5;33
2;по каким делам нет срока давности;51;18;1;6;33
2;срок давности по уголовным делам;48;5885;1778;5;32
2;срок давности по уголовному делу;43;5773;41;5;32
2;какой срок давности преступления;51;501;4;4;32
2;какие статьи имеют срок давности;24;22;2;5;32
2;давность лет по уголовным делам;18;118;6;5;31
2;срок истечения уголовного дела;34;2030;7;4;30
2;сроки уголовного преследования;32;1519;36;3;30
2;срок действия уголовной статьи;54;22;1;4;30
2;срок давности уголовного дела;29;8239;86;4;29
2;срок уголовного преследования;39;1519;27;3;29
2;срок действия уголовного дела;23;357;5;4;29
2;срок годности уголовного дела;32;41;7;4;29
2;срок давности уголовных дел;23;8056;24;4;27
2;сроки давности по уголовным;45;7877;30;4;27
2;сроки давности преступлений;50;7309;61;3;27
2;давность по уголовным делам;28;6019;5;4;27
2;срок действия уголовных дел;30;357;2;4;27
2;срок давности по уголовным;39;7877;39;4;26
2;срок давности преступление;49;7456;5;3;26
2;срок действия преступлений;30;224;3;3;26
2;срок действия преступления;36;222;10;3;26
2;срок годности преступления;39;16;16;3;26
2;давность уголовного дела;25;8321;2;3;24
2;срок давности дела;49;17016;6;3;18
20;как сделать лицензию на такси самому;34;33;6;6;36
22;уголовный кодекс об оскорблении личности человка;43;5;2;6;40
22;моральное оскорбление личности статья;37;44;6;4;37
26;образец жалобы на неправильно поставленный диагноз врача;33;1;1;7;56
26;врачи поставили неправильный диагноз куда жаловаться;17;36;4;6;52
26;если поставили неправильный диагноз куда жаловаться;12;57;4;6;51
26;врачи неправильно поставили диагноз куда обращаться;22;12;1;6;51
26;кому жаловаться на неправильно поставленный диагноз;17;3;1;6;51
26;если врач поставил неправильный диагноз что делать;44;51;19;7;50
26;врач поставил неправильный диагноз куда жаловаться;11;36;12;6;50
26;жалоба на неправильно поставленный диагноз образец;27;1;1;6;50
26;поставили неправильный диагноз куда жаловаться;7;57;3;5;46
26;куда жаловаться на неправильный диагноз врача;5;3;1;6;45
26;жалоба на неправильно поставленный диагноз;16;18;1;5;42
26;поставили неправильный диагноз что делать;50;96;2;5;41
26;если врач назначил неправильное лечение;37;42;7;5;39
26;куда жаловаться на неправильный диагноз;11;8;1;5;39
26;если врач неправильно поставил диагноз;51;407;4;5;38
26;неправильный диагноз врачей что делать;44;82;7;5;38
26;неправильный диагноз куда обращаться;24;71;1;4;36
26;жалоба на врача неправильный диагноз;9;31;1;5;36
26;если врач неверно поставил диагноз;46;84;3;5;34
26;врач написал неправильный диагноз;43;26;1;4;33
26;жалоба на неверный диагноз врача;9;9;4;5;32
26;если врач поставил неправильный;46;469;1;4;31
26;врач поставил ошибочный диагноз;49;114;1;4;31
26;жалобы на неправильный диагноз;21;71;1;4;30
输出数据(如果我自己没有弄错的话)
1 - 1;основные принципы демократического избирательного права;39;148;14;5;55
2 - 2;истечение срока давности уголовного преследования;40;553;28;5;49
20 - 20;как сделать лицензию на такси самому;34;33;6;6;36
22 - 22;уголовный кодекс об оскорблении личности человка;43;5;2;6;40
26 - 26;поставили неправильный диагноз куда жаловаться;7;57;3;5;46
您需要录制直播。
按时间或文件大小拆分,即录制广播并将其“随时随地”拆分为多个片段,以便立即开始编辑,而无需等待流结束。
目前,这个任务有几个库:
在线播放的问题是帧数可变(录制游戏),在 Sony Vegas 或 Adobe Premiere 中无法正常编辑(声音和视频不同步)(尽管在最新版本的 Adobe Premiere 中它们有支持可变数量的帧,但效果很差或根本不工作)
在此之前,我尝试使用 youtube-dl + ffmpeg 渲染到固定数量的帧来解决这个问题,但这会将我的笔记本电脑(i7,8 个线程,2.4 Gz)加载到 100%,这不允许使用安装与记录以前的情节并行。
我把这项任务推迟到更好的时候。
现在我决定使用streamlink返回。
虽然我正在尝试不渲染到恒定数量的帧。有必要实现视频的分段(按时间或文件大小)。但我不知道如何实现它。
当然,您可以在 Python 中运行一个 bat 文件,在其中启动 streamlink,并在 Python 中检查经过的时间,并在该过程结束时,减少该过程并重新开始。这里的问题是streamlink启动的时间比较长,在这期间会经过几秒的广播,不合适。
从streamlink的能力来看,这些是:
--hls-start-offset [HH:]MM:SS - Время, которое нужно пропустить с начала потока. Для потоков в реальном времени это отрицательное смещение от конца потока (перемотка назад).
--hls-duration [HH:]MM:SS - Ограничить продолжительность воспроизведения, полезно для просмотра сегментов потока. Фактическая продолжительность может быть немного больше, поскольку она округляется до ближайшего сегмента HLS.
По умолчанию: не ограничено .
我使用第二个命令并编写了一个 cmd - 脚本
:loop
set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%
set hour=%TIME:~0,2%
set minute=%TIME:~3,2%
set second=%TIME:~6,2%
set YYYYMMDD=%hour%_%minute%_%second%_%day%_%month%_%year%
streamlink --hls-live-edge 99999 --hls-segment-threads 10 --ringbuffer-size 1024M --hls-duration 00:05:00 -o %YYYYMMDD%.ts https://www.twitch.tv/makatao best
goto loop
但不幸的是,差距非常大。而且,如果我在视频中指定了5分钟,那么下一个将不会在5分钟或更多,而是不到5分钟开始。因此,需要在某个时间点将不同的视频相互同步,这也不是方便的
有没有人有什么建议?(频道选择了第一个可用的)
我的代码将 CPU 加载到 100% 以下
cls && @echo off & setlocal enableextensions enabledelayedexpansion
set "_tag_00=https://www.youtube.com/watch?v=aiHqRt-mqxo"
set "_tag_01=--ignore-errors --abort-on-error --ignore-config --flat-playlist --geo-bypass "
set "_tag_02=--restrict-filenames --no-part --no-cache-dir --write-thumbnail --prefer-ffmpeg "
set "_tag_03=--ffmpeg-location .\ --postprocessor-args -i "%%(title)s.%%(ext)s" -vf fps^=fps^=60^,"
set "_tag_04=scale^=1920x1080 -c:v libx264 -b:v 500k -preset superfast -c:a copy -f segment -segment_time "
set "_tag_05=60 %%^(title^)s.mp4"
youtube-dl "!_tag_00!" -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" -o "%%^(title^)s.%%^(ext^)s" !_tag_1!!_tag_2!!_tag_3!!_tag_4!!_tag_5!
Pause
代码 2(按持续时间拆分)
cls && @echo off & setlocal enableextensions enabledelayedexpansion
:: do some with the bat file, after then, for all links need `call :_yd_dl` %1
call :_yd_dl %1
echo/ is done^^!!
goto :eof
:_yd_dl
set "_tag_00=https://www.twitch.tv/ninja"
set "_tag_01= -t 00:60:00 -v error -stats -vf fps=fps=60,scale=1920x1080 -c:v libx264 -preset superfast -c:a copy "
for /f %%i in ('.\youtube-dl.exe -g !_tag_00! ^<nul ') do .\ffmpeg.exe -i "%%i" !_tag_01! .\output.mp4
exit /b
更新写了一个脚本
def refactor(second):
if str(second)[0] == "-":
number_sign = "-"
second = int(str(second)[1:])
else:
number_sign = ""
current_hours = str(second // 3600)
remainder_second = second % 3600
current_minutes = str(remainder_second // 60)
current_seconds = str(remainder_second % 60)
if len(current_hours) == 1:
current_hours = "0" + current_hours
if len(current_minutes) == 1:
current_minutes = "0" + current_minutes
if len(current_seconds) == 1:
current_seconds = "0" + current_seconds
text_time = number_sign + current_hours + ":" + current_minutes + ":" + current_seconds
return text_time
def run():
duration = 60
time_stream = 0
print(refactor(time_stream))
while True:
current_time_date = datetime.datetime.now().strftime("%H.%M.%S_%d_%m_%Y")
subprocess.call(["streamlink", "--hls-live-edge", "99999", "--hls-segment-threads", "10", "--ringbuffer-size", "1024M", "--hls-duration", refactor(duration), "--hls-start-offset", refactor(time_stream),"-o", current_time_date + ".ts", "https://www.twitch.tv/csruhub", "best"])
time_stream =+ duration
time.sleep(10)
他把它分成几个部分,但问题是他按时开始,但只有在部分结束时才完成。
事实证明,这些部分是相互叠加的。所以这个问题仍然是相关的。
我正在编写一个 Android 应用程序。
交互方式:REST API。
服务器:WampServer 本地服务器
问题:没有连接。我正在尝试连接到 API,但它不起作用:
编码:
public class ApiUtils {
// private static String apiUrl = "https://localhost/usatu/";
// private static String apiUrl = "https://192.168.0.102/usatu/";
// private static String apiUrl = "https://192.168.0.1/usatu/";
private static String apiUrl = "https://10.0.3.2/"
private static Retrofit retrofit;
private static APIService api;
public static Retrofit getRetrofit(){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(apiUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
return retrofit;
}
public static APIService getApi(){
if(api == null){
api = getRetrofit().create(APIService.class);
}
return api;
}
}
我根本无法连接到服务器:回溯:
W/System.err: io.reactivex.exceptions.OnErrorNotImplementedException: Failed to connect to /192.168.0.1:443
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.observers.ConsumerSingleObserver.onError(ConsumerSingleObserver.java:47)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:79)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.net.ConnectException: Failed to connect to /192.168.0.1:443
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:248)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:166)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:254)
at okhttp3.RealCall.execute(RealCall.java:92)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:186)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:41)
at io.reactivex.Observable.subscribe(Observable.java:10955)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
at io.reactivex.Observable.subscribe(Observable.java:10955)
at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
W/System.err: at io.reactivex.Single.subscribe(Single.java:2779)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err: at java.lang.Thread.run(Thread.java:764)
Caused by: java.net.ConnectException: failed to connect to /192.168.0.1 (port 443) from /192.168.234.231 (port 55154) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)
at libcore.io.IoBridge.isConnected(IoBridge.java:273)
at libcore.io.IoBridge.connectErrno(IoBridge.java:188)
at libcore.io.IoBridge.connect(IoBridge.java:130)
W/System.err: at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:129)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:616)
at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:73)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:246)
... 33 more
W/System.err: Caused by: android.system.ErrnoException: isConnected failed: ECONNREFUSED (Connection refused)
at libcore.io.IoBridge.isConnected(IoBridge.java:262)
... 43 more
虽然如果我通过浏览器访问服务器,http://localhost/usatu/v1/semesters会返回正确的结果。
ip 使用 ipconfig (window) 命令确定
在 Genymotion 模拟器上测试
更新:通过模拟器上的浏览器,我连接到地址htttp://10.0.3.2/v1/semesters
并且它在那里工作,但应用程序中的错误并没有消失
接口:
public interface APIService {
@GET("v1/semesters")
Single<List<Semester>> getSemesters();
}
主持人:
@InjectViewState
public class SearchScheduleStudentPresenter extends BasePresenter<SearchScheduleStudentView> {
private SearchScheduleStudentView mView;
public SearchScheduleStudentPresenter(SearchScheduleStudentView view) {
mView = view;
}
public void getSemesters(){
mCompositeDisposable.add(
ApiUtils.getApi()
.getSemesters()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
response -> mView.showSemesters(response)
)
);
}
}
看法
public interface SearchScheduleStudentView extends BaseView {
void showSemesters(List<Semester> semesters);
}
分段:
@Override
public void showSemesters(List<Semester> semesters) {
List<String> semestersName = new ArrayList<>();
for (Semester semester : semesters) {
semestersName.add(semester.getName());
}
// adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, semestersName);
}
显现
<uses-permission android:name="android.permission.INTERNET"/>
有一个代码:
<div class="sm gray">
<img class="absmid" alt="Продам" src="https://vestniktm.com/images/typep.gif"> Разместили сегодня (Дата окончания публикации: 18.04.2019 г.)</div>
本质上,此文本指的是一个 div。拉出这段文字就够了:
date = html.cssselect("div.sm.gray")[0].text
但是不,它返回无。我以为它指的是 Img,只是缺少尾随 /
date = html.cssselect("div.sm.gray > img")[0]
回来:
<img class="absmid" alt="Продам" src="https://vestniktm.com/images/typep.gif"> Разместили сегодня (Дата окончания публикации: 18.04.2019 г.)
所以这是真的。我们取文:
date = html.cssselect("div.sm.gray > img")[0].text
但它也返回无。什么?
将解析器从 lxml 更改为 html.parser,但错误仍然存在
大家好,您需要通过网站上的分页。
问题出现在第30页某处,加载货物的动画无限期挂起,因此无法执行任何操作。
此问题仅发生在 Selenium 中。
如果我自己浏览浏览器,一切都会好起来的。什么可能是这样的问题?
from selenium import webdriver
from selenium.common.exceptions import *
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
def get_index_develop():
global index_develop
index_develop += 1
return index_develop
def get_translated_text(text):
return text
def init_driver():
ff = "../install/geckodriver.exe"
# chrome_option = webdriver.ChromeOptions()
# # chrome_option.add_argument("headless")
# prefs = {"profile.managed_default_content_settings.images": 2}
# chrome_option.add_experimental_option("prefs", prefs)
try:
driver = webdriver.Firefox(executable_path=ff)
# driver = webdriver.Chrome(executable_path=ff, options=chrome_option)
# driver = webdriver.Chrome(executable_path=ff, chrome_options=chrome_option, service_args=service_args)
except SessionNotCreatedException:
print("Ошибка инициализации браузера. Скорее всего у вас не установлен браузер. Пожалуйста обратитесь к разработчику парсера")
return driver
def close_pop_up_window(driver):
blocks = driver.find_elements_by_css_selector(
"div.b-popup.js-popup >div > div.b-popup__header.js-popup__header > div")
for block in blocks:
try:
block.click()
break
except:
continue
time.sleep(1)
def parse_list_projects(driver):
urls = []
driver.get("https://www.hurriyetemlak.com/projeler/projects")
# Блок пагинации
while True:
close_pop_up_window(driver)
refresher = WebDriverWait(driver, 300).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, "div.b-scroll.js-search-left-content.js-preload-parent.b-preload-block.load")))
items = driver.find_elements_by_css_selector("div.b-snippet__wrapper.js-complex__wrapper")
for item in items:
href = item.get_attribute("data-href")
print("Найдена ссылка на проект", href)
urls.append(href)
try:
pagination_block = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, "span.b-pagination__item.b-pagination__item--next.js-pagination-next")))
pagination_block.click()
print("Перешли на следующую страницу")
except Exception as e:
try:
print("Проверка наличия всплываюшего окна")
button_close = driver.find_element_by_css_selector(
"button.b-button.b-button--full.b-button--confirm")
time.sleep(2)
button_close.click()
time.sleep(2)
print("Окно закрыли")
pagination_block = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, "span.b-pagination__item.b-pagination__item--next.js-pagination-next")))
pagination_block.click()
print("Нажатие на pagination снова")
except Exception as e:
try:
close_pop_up_window(driver)
pagination_block = WebDriverWait(driver, 15).until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, "span.b-pagination__item.b-pagination__item--next.js-pagination-next")))
pagination_block.click()
except:
print("Pagination не найдены. Конец перехода между страницами", e)
break
return urls, driver
if __name__ == '__main__':
start = time.time()
driver = init_driver()
urls, driver = parse_list_projects(driver)
print("Парсинг проектов")
print("Парсинг окончен. Время выполнения", time.time() - start)
refresher 只是在数据加载期间指示的元素
在浏览器初始化过程中,我们可以在初始化设置中指定代理。问题:我们可以在请求执行时更改它吗?
编程语言:Python
浏览器:Chrome
今天去面试,问题之一是:
如何将可变数量的变量传递给方法?
第一个想法是使用数组。但是,不幸的是,有人澄清说没有提供数组的使用。
不幸的是,除了使用列表和数组之外,我什么都没想到。有兴趣了解选项。
问题是在 C# 的上下文中。
PS我写道:“实现方法重载”。