使用BeautifulSoup从不规范源代码的HTML表格中提取链接
我正在尝试从一个中国报纸数据库中抓取文章。这里有一些源代码的片段(因为网站限制,所以只贴了一部分):
<base href="http://huylpd.twinbridge.com.ezp-prod1.hul.harvard.edu/web\" /><html>
<! -- <%@ page contentType="text/html;charset=GBK" %>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>概览页面</title>
...
</head>
...
</html>
</html>
当我试着像这样简单地抓取表格中的链接时:
import urllib, urllib2, re, mechanize
from BeautifulSoup import BeautifulSoup
br = mechanize.Browser(factory=mechanize.RobustFactory())
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6')]
br.set_handle_robots(False)
url = 'http://huylpd.twinbridge.com.ezp-prod1.hul.harvard.edu/search?%C8%D5%C6%DA=&%B1%EA%CC%E2=&%B0%E6%B4%CE=&%B0%E6%C3%FB=&%D7%F7%D5%DF=&%D7%A8%C0%B8=&%D5%FD%CE%C4=%B9%FA%BC%CA%B9%D8%CF%B5&Relation=AND&sortfield=RELEVANCE&image1.x=27&image1.y=16&searchword=%D5%FD%CE%C4%3D%28%B9%FA%BC%CA%B9%D8%CF%B5%29&presearchword=%B9%FA%BC%CA%B9%D8%CF%B5&channelid=16380'
page = br.open(url)
soup = BeautifulSoup(page)
links = soup.findAll('a') # links is empty =(
但是Python根本没有找到任何东西在html中,也就是说返回了一个空列表。我觉得这是因为源代码以base href标签开头,而Python只识别文档中的两个标签:base href和html。
有没有什么办法可以在这种情况下抓取链接呢?非常感谢!!
3 个回答
0
当你的HTML代码非常乱的时候,最好先把它整理一下。例如,在这种情况下,可以先删除所有在某个标签之前的内容,再删除第一个标签之后的所有内容。你可以下载一页网页,手动调整一下,看看什么样的格式是beautifulsoup可以接受的,然后再写一些正则表达式来进行预处理。
1
去掉第二行后,BS(Beautiful Soup,一个用于解析HTML和XML的库)能找到所有的标签了。我没有找到更好的方法来解析这个。
page = br.open(url)
page = page.read().replace('<! -- <%@ page contentType="text/html;charset=GBK" %>', '')
soup = BeautifulSoup(page)
0
BS(Beautiful Soup)这个工具其实已经不怎么更新了,我建议你去看看 lxml 这个库。
我没有办法访问那个特定的网址,不过我用一个HTML片段(我在里面加了一个a
标签)成功让它工作了。
>>> soup = lxml.html.document_fromstring(u)
>>> soup.cssselect('a')
>>> soup.cssselect('a')[0].text_content() #for example