0

私はPythonで作業しており、次のようなデータがあります:

RedHat Enterprise Linux ES 2.1 IA64
RedHat Enterprise Linux ES 2.1
Red Hat Enterprise Linux AS 2.1
Linux kernel 2.6.9 
Linux kernel 2.6.8 rc3
Linux kernel 2.6.8 rc1
    + Ubuntu Ubuntu Linux 4.1 ppc
    + Ubuntu Ubuntu Linux 4.1 ia64
Linux kernel 2.6.8 

この情報をjsonファイルに保存したいのですが、方法がわかりません! 次のリストのように、RedHat と Linux のリストがあり、Ubuntu は Linux カーネル 2.6.8 rc1 のサブリストです。

{"RedHat Enterprise Linux ES 2.1 IA64":{} ,"RedHat Enterprise Linux ES 2.1":{} ,"Red Hat Enterprise":{"Linux AS 2.1","Linux kernel 2.6.9","Linux kernel 2.6.8 rc3","Linux kernel 2.6.8 rc1"},"Linux kernel 2.6.8":{}}

これは私の文字列全体です:

'RedHat Enterprise Linux WS  2.1 IA64RedHat Enterprise Linux WS  2.1RedHat Enterprise Linux ES  2.1 IA64RedHat Enterprise Linux ES  2.1Red Hat Enterprise Linux AS  2.1 IA64Red Hat Enterprise Linux AS  2.1Linux kernel 2.6.9 Linux kernel 2.6.8 rc3Linux kernel 2.6.8 rc2Linux kernel 2.6.8 rc1+ Ubuntu Ubuntu Linux 4.1 ppc+ Ubuntu Ubuntu Linux 4.1 ia64+ Ubuntu Ubuntu Linux 4.1 ia32Linux kernel 2.6.8 Linux kernel 2.6.7 rc1Linux kernel 2.6.7 Linux kernel 2.6.6 rc1Linux kernel 2.6.6 Linux kernel 2.6.5 Linux kernel 2.6.4 Linux kernel 2.6.3 Linux kernel 2.6.2 Linux kernel 2.6.1 -rc2Linux kernel 2.6.1 -rc1Linux kernel 2.6.1 Linux kernel 2.6 .10Linux kernel 2.6 -test9-CVSLinux kernel 2.6 -test9Linux kernel 2.6 -test8Linux kernel 2.6 -test7Linux kernel 2.6 -test6Linux kernel 2.6 -test5Linux kernel 2.6 -test4Linux kernel 2.6 -test3Linux kernel 2.6 -test2Linux kernel 2.6 -test11Linux kernel 2.6 -test10Linux kernel 2.6 -test1Linux kernel 2.6 Linux kernel 2.4.28 + Trustix Secure Enterprise Linux 2.0 + Trustix Secure Linux 2.2 + Trustix Secure Linux 2.1 + Trustix Secure Linux 2.0 Linux kernel 2.4.27 -pre5Linux kernel 2.4.27 -pre4Linux kernel 2.4.27 -pre3Linux kernel 2.4.27 -pre2Linux kernel 2.4.27 -pre1Linux kernel 2.4.27 Linux kernel 2.4.26 Linux kernel 2.4.25 Linux kernel 2.4.24 -ow1Linux kernel 2.4.24 Linux kernel 2.4.23 -pre9Linux kernel 2.4.23 -ow2Linux kernel 2.4.23 + Trustix Secure Linux 2.0 Linux kernel 2.4.22 + Devil-Linux Devil-Linux 1.0.5 + Devil-Linux Devil-Linux 1.0.4 + Mandriva Linux Mandrake 9.2  amd64+ Mandriva Linux Mandrake 9.2 + Red Hat Fedora  Core1+ Slackware Linux 9.1 Linux kernel 2.4.21 pre7Linux kernel 2.4.21 pre4Linux kernel 2.4.21 pre1Linux kernel 2.4.21 + Conectiva Linux 9.0 + Mandriva Linux Mandrake 9.1 ppc+ Mandriva Linux Mandrake 9.1 + Red Hat Enterprise Linux AS  3+ RedHat Desktop 3.0 + RedHat Enterprise Linux ES  3+ RedHat Enterprise Linux WS  3+ S.u.S.E. Linux Personal 9.0 x86_64+ S.u.S.E. Linux Personal 9.0 + SuSE SUSE Linux Enterprise Server  8Linux kernel 2.4.20 Linux kernel 2.4.19 -pre6Linux kernel 2.4.19 -pre5Linux kernel 2.4.19 -pre4Linux kernel 2.4.19 -pre3Linux kernel 2.4.19 -pre2Linux kernel 2.4.19 -pre1Linux kernel 2.4.19 + Conectiva Linux 8.0 + Conectiva Linux Enterprise Edition 1.0 + MandrakeSoft Corporate Server 2.1  x86_64+ MandrakeSoft Corporate Server 2.1 + MandrakeSoft Multi Network Firewall 2.0 + Mandriva Linux Mandrake 9.0 + S.u.S.E. Linux 8.1 + Slackware Linux  -current+ SuSE SUSE Linux Enterprise Server  8+ SuSE SUSE Linux Enterprise Server  7Linux kernel 2.4.18 pre-8Linux kernel 2.4.18 pre-7Linux kernel 2.4.18 pre-6Linux kernel 2.4.18 pre-5Linux kernel 2.4.18 pre-4Linux kernel 2.4.18 pre-3Linux kernel 2.4.18 pre-2Linux kernel 2.4.18 pre-1Linux kernel 2.4.18  x86Linux kernel 2.4.18 + Astaro Security Linux 2.0 23+ Astaro Security Linux 2.0 16+ Debian Linux 3.0  sparc+ Debian Linux 3.0  s/390+ Debian Linux 3.0  ppc+ Debian Linux 3.0  mipsel+ Debian Linux 3.0  mips+ Debian Linux 3.0  m68k+ Debian Linux 3.0  ia-64+ Debian Linux 3.0  ia-32+ Debian Linux 3.0  hppa+ Debian Linux 3.0  arm+ Debian Linux 3.0  alpha+ Mandriva Linux Mandrake 8.2 + Mandriva Linux Mandrake 8.1 + Mandriva Linux Mandrake 8.0 + Red Hat Enterprise Linux AS  2.1 IA64+ RedHat Advanced Workstation for the Itanium Processor 2.1 IA64+ RedHat Advanced Workstation for the Itanium Processor 2.1 + RedHat Linux 8.0 + RedHat Linux 7.3 + S.u.S.E. Linux 8.1 + S.u.S.E. Linux 8.0 + S.u.S.E. Linux 7.3 + S.u.S.E. Linux 7.2 + S.u.S.E. Linux 7.1 + S.u.S.E. Linux Connectivity Server  + S.u.S.E. Linux Database Server  0+ S.u.S.E. Linux Firewall on CD  + S.u.S.E. Linux Office Server  + S.u.S.E. Linux Openexchange Server  + S.u.S.E. Linux Personal 8.2 + S.u.S.E. SuSE eMail Server 3.1 + S.u.S.E. SuSE eMail Server III  + SuSE SUSE Linux Enterprise Server  8+ SuSE SUSE Linux Enterprise Server  7+ Turbolinux Turbolinux Server 8.0 + Turbolinux Turbolinux Server 7.0 + Turbolinux Turbolinux Workstation 8.0 + Turbolinux Turbolinux Workstation 7.0 Linux kernel 2.4.17 Linux kernel 2.4.16 Linux kernel 2.4.15 Linux kernel 2.4.14 Linux kernel 2.4.13 + Caldera OpenLinux Server 3.1.1 + Caldera OpenLinux Workstation 3.1.1 Linux kernel 2.4.12 + Conectiva Linux 7.0 Linux kernel 2.4.11 Linux kernel 2.4.10 Linux kernel 2.4.9 + Red Hat Enterprise Linux AS  2.1 IA64+ Red Hat Enterprise Linux AS  2.1+ RedHat Enterprise Linux ES  2.1 IA64+ RedHat Enterprise Linux ES  2.1+ RedHat Enterprise Linux WS  2.1 IA64+ RedHat Enterprise Linux WS  2.1+ RedHat Linux 7.2  ia64+ RedHat Linux 7.2  i386+ RedHat Linux 7.2  alpha+ RedHat Linux 7.1  ia64+ RedHat Linux 7.1  i386+ RedHat Linux 7.1  alpha+ Sun Linux 5.0.5 + Sun Linux 5.0.3 + Sun Linux 5.0 Linux kernel 2.4.8 + Mandriva Linux Mandrake 8.2 + Mandriva Linux Mandrake 8.1 + Mandriva Linux Mandrake 8.0 Linux kernel 2.4.7 + RedHat Linux 7.2 + S.u.S.E. Linux 7.2 + S.u.S.E. Linux 7.1 Linux kernel 2.4.6 Linux kernel 2.4.5 + Slackware Linux 8.0 Linux kernel 2.4.4 + S.u.S.E. Linux 7.2 Linux kernel 2.4.3 + Mandriva Linux Mandrake 8.0  ppc+ Mandriva Linux Mandrake 8.0 Linux kernel 2.4.2 Linux kernel 2.4.1 Linux kernel 2.4 .0-test9Linux kernel 2.4 .0-test8Linux kernel 2.4 .0-test7Linux kernel 2.4 .0-test6Linux kernel 2.4 .0-test5Linux kernel 2.4 .0-test4Linux kernel 2.4 .0-test3Linux kernel 2.4 .0-test2Linux kernel 2.4 .0-test12Linux kernel 2.4 .0-test11Linux kernel 2.4 .0-test10Linux kernel 2.4 .0-test1Linux kernel 2.4 Debian Linux 3.1  sparcDebian Linux 3.1  s/390Debian Linux 3.1  ppcDebian Linux 3.1  mipselDebian Linux 3.1  mipsDebian Linux 3.1  m68kDebian Linux 3.1  ia-64Debian Linux 3.1  ia-32Debian Linux 3.1  hppaDebian Linux 3.1  armDebian Linux 3.1  amd64Debian Linux 3.1  alphaDebian Linux 3.1 Debian Linux 3.0  sparcDebian Linux 3.0  s/390Debian Linux 3.0  ppcDebian Linux 3.0  mipselDebian Linux 3.0  mipsDebian Linux 3.0  m68kDebian Linux 3.0  ia-64Debian Linux 3.0  ia-32Debian Linux 3.0  hppaDebian Linux 3.0  armDebian Linux 3.0  alphaDebian Linux 3.0'

これを解析する必要があり、 + は部分文字列です。

4

1 に答える 1

1

あなたが解決しようとしている問題と、サンプルの SecurityFocus Bid 記事 (この場合は securityfocus.com/bid/20959) を調べました。ここでの考え方は、BeautifulSoupのようなスクレーパーを使用して Web ページからテキストを抽出することです。次に、このテキストを解析して情報を JSON オブジェクトに変換し、ファイルにダンプできます。SecurityFocus の TexInfo ファイルからの情報には、単一のタグ内にすべての脆弱なオペレーティング システムのリストが含まれています。オペレーティング システムのフレーバー (SuSE Linux 8.0 など) に関連するカーネルがその下に表示され、+記号が前に付いています (+ Linux Kernel 2.4.5 など)。+記号は実際には単純な+記号ではなく、 \n\t\t\t\t\t\t\t\t+のようなものです. このため、JSON に変換する前に文字列を処理する必要があります。以下のコード スニペットは、url securityfocus.com/bid/20959に対してこのタスクを実行します。

from bs4 import BeautifulSoup
import urllib2
import json

response = urllib2.urlopen(r'http://www.securityfocus.com/bid/20959')
html = response.read()
soup = BeautifulSoup(html)
div_element = soup.find(id="vulnerability")
tr_element = div_element.find_all(valign="top")

td_elements =  tr_element[1].find_all("td")

os_names_list = []
for os_name in td_elements[1].stripped_strings:
    os_names_list.append(os_name)

related_kernel_indices = []
[related_kernel_indices.append(i) for i in range(0,len(os_names_list)) if os_names_list[i].startswith('+')]
for i in range(0,len(related_kernel_indices)):
    os_names_list[related_kernel_indices[i]] = os_names_list[related_kernel_indices[i] - i - 1] + '-' + " ".join(os_names_list[related_kernel_indices[i]].split()[1:])


#loop through the modified list and create a dictionary of OS names along with the correspoding kernel relations
vulnerability_os_mapping = {}

for os_name_entry in os_names_list:
    related_kernels = []
    os_name_components = os_name_entry.split('-')
    if not vulnerability_os_mapping.has_key(os_name_components[0]):
        vulnerability_os_mapping[os_name_components[0]] = related_kernels
    elif len(os_name_components) > 1:
        vulnerability_os_mapping[os_name_components[0]].append(os_name_components[1])

#create a file with a template name - vulnerability_list_<bid_id>.json
vulnerability_list_file = open('vulnerability_list_20959.json','w')
json.dump(vulnerability_os_mapping, vulnerability_list_file)

これにより、そのようなタスクを実行する方法についてのアイデアが得られることを願っています.

于 2013-08-28T17:41:28.933 に答える