Python3刮刀。不解析xpath直到结束

时间:2016-04-28 20:14:54

标签: python python-3.x web-scraping web-crawler

我正在使用 lxml.html 模块

from lxml import html   

page = html.parse('http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution')

# print(page.content)

unis = page.xpath('//tr/td[@valign="top" and @style="width: 50%;padding-right:15px"]/h3/text()')

print(unis.__len__())

with open('workfile.txt', 'w') as f:
    for uni in unis:
        f.write(uni + '\n')

这里的网站(http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution#Z)到处都是大学。

问题在于它解析直到字母“H' (244 unis)。 我无法理解为什么,因为我看到它将所有HTML解析到最后。

我还记录了我自己,244不是列表的限制或python3中的任何内容。

2 个答案:

答案 0 :(得分:1)

HTML页面根本不是HTML,它完全被破坏了。但以下将做你想要的。它使用rename解析器。

int execv(const char *path, char *const argv[]);

有关详细信息,请参阅BeautifulSoup

答案 1 :(得分:1)

对于网页抓取,我建议您使用BeautifulSoup 4 使用bs4,这很容易做到:

from bs4 import BeautifulSoup
import urllib.request

universities = []
result = urllib.request.urlopen('http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution#Z')

soup = BeautifulSoup(result.read(),'html.parser')

table = soup.find_all(lambda tag: tag.name=='table')
for t in table:
    rows = t.find_all(lambda tag: tag.name=='tr')
    for r in rows:
        # there are also the A-Z headers -> check length
        # there are also empty headers -> check isspace()
        headers = r.find_all(lambda tag: tag.name=='h3' and tag.text.isspace()==False and len(tag.text.strip()) > 2)
        for h in headers:
            universities.append(h.text)