Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

download: failed at yukicoder No.649 #355

Closed
uta8a opened this issue Mar 5, 2019 · 7 comments
Closed

download: failed at yukicoder No.649 #355

uta8a opened this issue Mar 5, 2019 · 7 comments

Comments

@uta8a
Copy link
Contributor

uta8a commented Mar 5, 2019

お疲れさまです。
以下のバージョン,環境でNo.649 ここでちょっとQK!のダウンロードが失敗しました。
他の問題では正常にダウンロードできました。

version: online-judge-tools 0.1.55
環境: Windows10, WSL ubuntu18.04
エラーメッセージ:

kaito@PC:~/procon/procon/yukicoder/183/d$ oj dl https://yukicoder.me/problems/no/649
[x] problem recognized: <onlinejudge.service.yukicoder.YukicoderProblem object at 0x7f3e9ab14eb8>: https://yukicoder.me/problems/no/649
[x] load cookie from: /home/kaito/.local/share/online-judge-tools/cookie.jar
[x] GET: https://yukicoder.me/problems/no/649
[x] 200 OK
Traceback (most recent call last):
  File "/home/kaito/.local/bin/oj", line 7, in <module>
    onlinejudge.implementation.main.main(args=sys.argv[1:])
  File "/home/kaito/.local/lib/python3.6/site-packages/onlinejudge/implementation/main.py", line 318, in main
    run_program(namespace, parser=parser)
  File "/home/kaito/.local/lib/python3.6/site-packages/onlinejudge/implementation/main.py", line 287, in run_program
    download(args)
  File "/home/kaito/.local/lib/python3.6/site-packages/onlinejudge/implementation/command/download.py", line 53, in download
    samples = problem.download_sample_cases(session=sess)  # type: ignore
  File "/home/kaito/.local/lib/python3.6/site-packages/onlinejudge/service/yukicoder.py", line 275, in download_sample_cases
    it = self._parse_sample_tag(pre)
  File "/home/kaito/.local/lib/python3.6/site-packages/onlinejudge/service/yukicoder.py", line 312, in _parse_sample_tag
    if prv.name == 'h6' and tag.parent.name == 'div' and tag.parent['class'] == ['paragraph'] and pprv.name == 'h5':
AttributeError: 'NoneType' object has no attribute 'name'
@kmyk
Copy link
Member

kmyk commented Mar 6, 2019

ありがとうございます。落ちるの確認しました。
バグなので直しますが、いま大きめの変更を入れようとしていて衝突するので、対応はすこし待ってください。

@kmyk
Copy link
Member

kmyk commented Mar 6, 2019

@tMasaaa もし興味があれば修正のプルリクを書いてみませんか?
このブランチ issue/355 の後ろに続けてコミットをして、テストとCIが適切に通るようにしてもらえばよいです。

@uta8a
Copy link
Contributor Author

uta8a commented Mar 6, 2019

@kmyk
ありがとうございます。チャレンジさせてください。
No.649では入力説明欄のpreタグが3つあり、後ろの二つはdivに入って入れ子になっているため、previous_siblingがただの文章"タイプ1のクエリの場合:"を指して、結果そのタグがNoneになりprvがNoneになっていると思われます。
(入れ子になったpreタグ)

<div>  
タイプ1のクエリの場合: <pre>$1\ v_i$</pre>
タイプ2のクエリの場合: <pre>$2$</pre>
</div>

ここで相談なのですが、util.pyのutil.previous_sibling_tagを変更して例外処理を入れて、previous_siblingがNoneを返す代わりに<div></div>を返すようにするのはどうでしょうか。yukicoder以外にも、Noneが出た時に困ると思い、util.pyの変更を提案しています。

utilに変更を入れるのは大きな範囲に影響が及ぶためプルリク前に相談しました。

@kmyk
Copy link
Member

kmyk commented Mar 6, 2019

原因の分析はまったく正しそうです。

解決策としてはもうひとつ選択肢があります。yukicoder が <div class="sample"> という形の div タグを使ってくれているので、この中だけを見るというものです。今回の問題となっている pre タグはその外側なので解決されます。

ふたつの選択肢のどちらを採用するかですが、 utils.previous_sibling より <div class="sample"> によるものの方が適切であるはずです。
特に <div></div> を返してしまうのは (私の意見では) 避けたいです。想定されていない事態が発生したときにエラーにならず適当に誤魔化されてしまうと「サンプルが通らなくて苦しんでいたが、よく見たら取得したサンプルが間違っていた」みたいな事態につながる危険性があるためです。


現状が <div class="sample"> を利用していないので、単に見落しによるもののはずです。

加えて utils.previous_sibling はそもそも書くべきでなかったものです。なので必要なら bs4.Tag.previous_sibling で置き換えてください。(この関数の存在は後から気付きました)
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#next-sibling-and-previous-sibling

@kmyk
Copy link
Member

kmyk commented Mar 6, 2019

(ところで本題とは関係ないんだけど、Issue の建て方や相談の仕方が完璧ですごいのでぜひ続けてほしい)

uta8a added a commit to uta8a/online-judge-tools that referenced this issue Mar 6, 2019
@uta8a
Copy link
Contributor Author

uta8a commented Mar 6, 2019

kmykさんの方針で、class sampleの子孫のpreタグを取得するように変更してプルリク作りました #356

(初めて翻訳以外で、issueやプルリク出したのでそう言っていただけてとても嬉しいです…)

uta8a added a commit to uta8a/online-judge-tools that referenced this issue Mar 8, 2019
uta8a added a commit to uta8a/online-judge-tools that referenced this issue Mar 8, 2019
uta8a added a commit to uta8a/online-judge-tools that referenced this issue Mar 8, 2019
kmyk added a commit that referenced this issue Mar 8, 2019
#355: fix pre.previous_sibling become None Bug at yukicoder
@kmyk
Copy link
Member

kmyk commented Mar 8, 2019

#361 で解決したので閉じます。
@tMasaaa ありがとうございました

@kmyk kmyk closed this as completed Mar 8, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants