使用 Python 和 BeautifulSoup(将网页源代码保存到本地文件中)

Posted

技术标签:

【中文标题】使用 Python 和 BeautifulSoup(将网页源代码保存到本地文件中)【英文标题】:Using Python and BeautifulSoup (saved webpage source codes into a local file) 【发布时间】:2014-03-01 12:03:06 【问题描述】:

我正在使用 Python 2.7 + BeautifulSoup 4.3.2。

我正在尝试使用 Python 和 BeautifulSoup 来获取网页上的信息。因为网页在公司网站,需要登录和重定向,所以为了方便练习,我把目标页面的源代码页面复制到一个文件中,保存为“example.html”在C:\中。

这是原代码的一部分:

<tr class="ghj">
    <td><span class="city-sh"><sh src="./citys/1.jpg"  title="boy" /></span><a href="./membercity.php?mode=view&amp;u=12563">port_new_cape</a></td>
    <td class="position"><a href="./search.php?id=12563&amp;sr=positions" title="Search positions">452</a></td>
    <td class="details"><div>South</div></td>
    <td>May 09, 1997</td>
    <td>Jan 23, 2009 12:05 pm&nbsp;</td>
</tr>

到目前为止我编写的代码是:

from bs4 import BeautifulSoup
import re
import urllib2

url = "C:\example.html"
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read())

cities = soup.find_all('span', 'class' : 'city-sh')

for city in cities:
print city

这只是测试的第一阶段,所以有些不完整。

但是,当我运行它时,它会给出一条错误消息。用urllib2.urlopen打开本地文件好像不太合适。

 Traceback (most recent call last):
   File "C:\Python27\Testing.py", line 8, in <module>
     page = urllib2.urlopen(url)
   File "C:\Python27\lib\urllib2.py", line 127, in urlopen
     return _opener.open(url, data, timeout)
   File "C:\Python27\lib\urllib2.py", line 404, in open
     response = self._open(req, data)
   File "C:\Python27\lib\urllib2.py", line 427, in _open
     'unknown_open', req)
   File "C:\Python27\lib\urllib2.py", line 382, in _call_chain
     result = func(*args)
   File "C:\Python27\lib\urllib2.py", line 1247, in unknown_open
     raise URLError('unknown url type: %s' % type)
 URLError: <urlopen error unknown url type: c>

如何练习使用本地文件?

【问题讨论】:

请尝试:soup = BeautifulSoup(open(url).read()) 并注意 url 应为 url = r"C:\example.html" 否则 url 中的 `\` 充当转义字符。 谢谢你,钱丹。我将其更改为 url = r"C:\example.html" page = open(url) soup = BeautifulSoup(page.read()),它可以工作。在我的情况下,“urllib2.url”在这里没用。 【参考方案1】:

使用 BeautifulSoup 打开本地文件的最佳方法是直接将文件处理程序传递给它。 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#making-the-soup

from bs4 import BeautifulSoup

with open("C:\\example.html") as fp:
    soup = BeautifulSoup(fp, 'html.parser')

for city in soup.find_all('span', 'class' : 'city-sh'):
    print(city)

【讨论】:

它显示警告。答案是here 在 Mac 上,soup = BeautifulSoup(open("/path/to/your/file.html"), "html.parser") 最好的方法?它显示资源警告:未关闭的文件 @MatejJ 感谢您的提醒。看起来他们更新了文档/它是如何工作的。现在它不为你处理关闭。使用上下文管理器更新以匹配新文档。【参考方案2】:

在Chandan的帮助下,问题已经解决了。所有的学分都归他所有。 :)

“urllib2.url”在这里没用。

from bs4 import BeautifulSoup
import re
# import urllib2

url = "C:\example.html"
page = open(url)
soup = BeautifulSoup(page.read())

cities = soup.find_all('span', 'class' : 'city-sh')

for city in cities:
    print city

【讨论】:

如果urllib2.url没用,那还需要import urllib2吗? 我会替换 . soup = BeautifulSoup(page.read())soup = BeautifulSoup(page.read(), features="lxml") 以便能够正确导航 DOM。 @Haddock-san,我最近在***.com/questions/58300101/… 有发现,你可能想看看。【参考方案3】:

您也可以尝试使用 lxml 解析器。这是您的 html 数据的示例。

from lxml.html import fromstring
import lxml.html as PARSER

data = open('example.html').read()
root = PARSER.fromstring(data)

for ele in root.getiterator():
    if ele.tag == "td":
        print ele.text_content()

o/p: port_new_cape 452 南 1997 年 5 月 9 日 2009 年 1 月 23 日下午 12:05

【讨论】:

以上是关于使用 Python 和 BeautifulSoup(将网页源代码保存到本地文件中)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 和 BeautifulSoup(将网页源代码保存到本地文件中)

使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)

使用 urllib 和 BeautifulSoup 通过 Python 从 Web 检索信息

python 使用BeautifulSoup和Python从网页中提取文本

如何使用 Python 3.5 和 BeautifulSoup 抓取 href [重复]

Python和BeautifulSoup编码问题[重复]