从高度非结构化的网页中提取数据

时间:2016-08-20 08:54:04

标签: web-scraping beautifulsoup

我通常使用带有python的Beautiful soup来从页面中提取数据。我遇到了一种奇怪的情况,即他们以非常严格的方式投入了输入。

这是页面 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')

1 个答案:

答案 0 :(得分: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 = இகழ்ச்சி நகைசெய்தல்.