【问题标题】:Extracting data from highly unstructured web page从高度非结构化的网页中提取数据
【发布时间】:2016-08-20 21:47:10
【问题描述】:

我通常使用 Beautiful soup 和 python 从页面中提取数据。我遇到了一种奇怪的情况,他们以一种非常非结构化的方式输入。

这是页面 http://dsalsrv02.uchicago.edu/cgi-bin/app/kadirvelu_query.py?page=2

在检查源时,我发现它是这样存储的

1) <a href="/cgi-bin/app/kadirvelu_query.py?qs=அகங்காரவிர்த்தி&searchhws=yes"><hw>அகங்காரவிர்த்தி</hw></a> akangkāravirtti (<a href="/cgi-bin/app/kadirvelu_query.py?page=2">p. 2</a>) நானென்னும்வடிவுஞானம்.
<br>
2) <a href="/cgi-bin/app/kadirvelu_query.py?qs=அகங்காரான்ம ஞானம்&searchhws=yes"><hw>அகங்காரான்ம ஞானம்</hw></a> akangkārāṉm ஞானம் (<a href="/cgi-bin/app/kadirvelu_query.py?page=2">p. 2</a>) அகங்காரமேஆன்மாவெனக்கொள்ளும் அறிவு.
<br>

因此任何查询都无法获取我所需的输出

அகங்காரவிர்த்தி , akangkāravirtti , நானென்னும்வடிவுஞானம௮

这不过是 . 单词 , 英文 音译 , 意义 .

目前我正在使用以下代码来获取损坏类型的输出

for a in soup.findAll('a'):
        print >> f , a.text.encode('utf8')

【问题讨论】:

    标签: web-scraping beautifulsoup


    【解决方案1】:

    html 很糟糕,通过w3c validator 运行它会给出161 个错误,82 个警告,要获得你想要的文本需要做一些事情,但这应该得到你想要的:

    from bs4 import BeautifulSoup
    import requests
    
    soup = BeautifulSoup(requests.get(url).content)
    strings = [[a.text.strip(), a.find_next_sibling(text=True).strip("() \n"), a.find_next("br").find_previous(text=True).strip("\n )")] for a in soup.select("a[href^=/cgi-bin/app/kadirvelu_query.py?qs=]")]
    

    这给了你:

    In [17]: for a,b, c in strings:
                  print(u"a = {}".format(a))
                  print(u"b = {}".format(b))
                  print(u"c = {}".format(c))
       ....:     
    a = அகங்காரவிர்த்தி
    b = akangkāravirtti
    c = நானென்னும்வடிவுஞானம்.
    a = அகங்காரான்ம ஞானம்
    b = akangkārāṉm ஞானம்
    c = அகங்காரமேஆன்மாவெனக்கொள்ளும் அறிவு.
    a = அகங்காரி
    b = akangkāri
    c = செருக்குடையவன், கர்வி.
    a = அகங்காழ்
    b = akangkāẕ
    c = அகக்காழ்.
    a = அகங்கை
    b = akangkai
    c = உள்ளங்கை.
    a = அகசன்
    b = akacaṉ
    c = கேது.
    a = அகசியக்காரன்
    b = akaciyakkāraṉ
    c = விதூஷகன்.
    a = அகசியக்கூத்து
    b = akaciyakkūttu
    c = பகடிக்கூத்து.
    a = அகசியம்
    b = akaciyam
    c = ஆசியம், வேடிக்கை.
    a = அகச்சத்தாதுவித்தசமாதி
    b = akaccattātuvittacamāti
    c = ஆறு சமாதிகளில் ஒன்று.
    a = அகச்சுவை
    b = akaccuvai
    c = நாடகரசத்தொன்று, ஞானம்.
    a = அகடச்சக்கரம்
    b = akaṭaccakkaram
    c = உதரபந்தனம் என்னுமணி.
    a = அகடிதகடநா
    b = akaṭitakaṭanā
    c = மாயாகாரியஞ்செய்தல்.
    a = அகடியம்
    b = akaṭiyam
    c = அநீதி.
    a = அகடூரி
    b = akaṭūri
    c = பாம்பு.
    a = அகட்டுத்தே
    b = akaṭṭuttē
    c = விநாயகன்.
    a = அகணித பஞ்சாங்கம்
    b = akaṇit பஞ்சாங்கம்
    c = அலகிடாதுசொல்லும் பஞ்சாங்கம்.
    a = அகணிதபஞ்சாங்கி
    b = akaṇitapañcāngki
    c = கணியாதபஞ்சாங்கஞ்சொல்வோன்.
    a = அகண்
    b = akaṇ
    c = அருகு.
    a = அகண்டஞானம்
    b = akaṇṭañāṉam
    c = பரிபூரணஞானம்.
    a = அகண்டவடிவம்
    b = akaṇṭavaṭivam
    c = நீக்கமற்றசொரூபம்.
    a = அகண்டவாக்கியம்
    b = akaṇṭavākkiyam
    c = விட்டும் விடாதவிலக்கணை.
    a = அகண்டாகண்டன்
    b = akaṇṭākaṇṭaṉ
    c = பரப்பிரமம்,கடவுள்
    a = அகண்டாகாரஞானம்
    b = akaṇṭākārañāṉam
    c = பரிபூரணஞாநம்
    a = அகண்டாகாரம்
    b = akaṇṭākāram
    c = விசாலம்,அளவுபடாதவடிவம்.
    a = அகண்டாகாரவிர்த்திஞானம்
    b = akaṇṭākāravirttiñāṉam
    c = பேரறிவு.
    a = அகண்டி
    b = akaṇṭi
    c = ஒருவாச்சியம்.
    a = அகண்டிதமூர்த்தி
    b = akaṇṭitamūrtti
    c = கண்டிக்கப்படாதவடிவுடையோன்.
    a = அகண்டித பூர்த்தி
    b = akaṇṭit பூர்த்தி
    c = கப்படிக்கப்படாதவடிவுடையோன்.
    a = அகண்டிதன்
    b = akaṇṭitaṉ
    c = எங்கும் நிறைந்தவன்.
    a = அகண்டிதாகாரம்
    b = akaṇṭitākāram
    c = கண்டிக்கப்படாதவுருவம்.
    a = அகதிகம்
    b = akatikam
    c = உரைக்கப்படாதது.
    a = அகதேசி
    b = akatēci
    c = உள்ளூரவன்.
    a = அகத்தடியாள்
    b = akattaṭiyāḷ
    c = மனையாள்.
    a = அகத்தியா
    b = akattiyā
    c = ஆழம், எட்டாமை, கடல்.
    a = அகத்தியான்
    b = akattiyāṉ
    c = அகத்தியமுனிவன்.
    a = அகத்தை
    b = akattai
    c = தாய்.
    a = அகநகர்
    b = akanakar
    c = நகருள்.
    a = அகநகை
    b = akanakai
    c = இகழ்ச்சிநகை.
    a = அகநகைத்தல்
    b = akanakaittal
    c = இகழ்ச்சி நகைசெய்தல்.
    

    【讨论】:

    • 非常感谢。我做了一个小技巧,这样我就可以在一行中获得输出,进一步可以用于处理数据。 for a,b, c in strings: print &gt;&gt; f , (u"{}".format(a).encode('utf8')) , print &gt;&gt; f , (u"{}".format(b).encode('utf8')) , print &gt;&gt; f , (u"{}".format(c).encode('utf8'))
    猜你喜欢
    • 2022-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2021-05-15
    • 2016-09-10
    • 1970-01-01
    • 2020-06-19
    • 2016-09-07
    相关资源
    最近更新 更多