实时抓取网页数据( soup解析器的惯用方法及修改解析树的使用方法介绍 )

优采云 发布时间: 2021-10-25 02:02

  实时抓取网页数据(

soup解析器的惯用方法及修改解析树的使用方法介绍

)

  <a id="_0"></a>数据抓取操作步骤

创建用于发送HTTP请求时将用到的所有值发出HTTP请求并下载所有数据解析这些数据文件中需要的数据,

<a id="_4"></a>具体操作步骤

<p>首先需要弄清需要访问哪个URL以及需要哪种HTTP方法。HTTP方法类似于:

method="post"

</p>

  该网址类似于:

  action="Data_Elements.aspx?Data=2"

  美汤

  Beautiful Soup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据。它使用您最喜欢的解析器来提供用于导航、搜索和修改解析树的惯用方法。它通常可以为程序员节省数小时或数天。

  以下是中文帮助文档的链接

  这是不同美汤解析器的对比

  

  使用 Beautiful Soup 提取隐藏字段

  任务:使用 BeautifulSoup 处理 HTML 并提取

  “__EVENTVALIDATION”和“__VIEWSTATE”的隐藏表字段值,并在数据字典中设置相应的值。

  代码:

  def extract_data(page):

# 同之前的方法一样,定义字典,方便对键赋值

data = {"eventvalidation": "",

"viewstate": ""}

with open(page, "r") as html:

# 这里用lxml解析器,后文会做简要介绍

soup = BeautifulSoup(html, "lxml")

ev = soup.find(id="__EVENTVALIDATION")

# 把ev中value的值取出来给data的键

data["eventvalidation"] = ev["value"]

vs = soup.find(id="__VIEWSTATE")

data["viewstate"] = vs["value"]

return data

  解析器图像

  建议使用 lxml 作为解析器,因为它更高效。Python32.7.3之前的版本和3.2.2之前的版本,必须安装lxml或者html5lib,因为标准内置的HTML解析方法这些 Python 版本的库不够稳定。

  提示:如果 HTML 或 XML 文档的格式不正确,不同的解析器返回的结果可能不同

  find() 方法

  查找(名称,属性,递归,文本,**kwargs)

  find_all() 方法会返回文档中所有符合条件的标签,尽管有时我们只想得到一个结果。比如文档中只有一个标签,那么就不宜使用find_all()方法查找标签,使用find_all方法并设置limit=1参数不如使用find()方法直接。下面两行代码是等价的:

  soup.find_all(&#39;title&#39;, limit=1)

# [The Dormouse&#39;s story]

soup.find(&#39;title&#39;)

# The Dormouse&#39;s story

  唯一的区别是 find_all() 方法的返回结果是一个值收录一个元素的列表,而 find() 方法直接返回结果。

  find_all() 方法没有找到目标是返回一个空列表,当find() 方法找不到目标时,它返回None。

  print(soup.find("nosuchtag"))

# None

  Soup.head.title 是标签名称方法的简写。这个速记的原理是多次调用当前标签的find()方法:

  soup.head.title

# The Dormouse&#39;s story

soup.find("head").find("title")

# The Dormouse&#39;s story

  练习:获取运算符列表

  任务

  获取所有航空公司的列表。删除您返回的数据中的所有组合,例如“所有美国运营商”。最终,您应该返回操作员代码列表。

  部分处理代码:

  

All U.S. and Foreign Carriers

All U.S. Carriers

All Foreign Carriers

AirTran Airways

Alaska Airlines

American Airlines

American Eagle Airlines

Atlas Air

Delta Air Lines

ExpressJet Airlines

Frontier Airlines

Hawaiian Airlines

JetBlue Airways

SkyWest Airlines

Southwest Airlines

Spirit Air Lines

US Airways

United Air Lines

Virgin America

All

All Major Airports

- Atlanta, GA: Hartsfield-Jackson Atlanta International

- Baltimore, MD: Baltimore/Washington International Thurgood Marshall

- Boston, MA: Logan International

- Charlotte, NC: Charlotte Douglas International

- Chicago, IL: Chicago Midway International

- Chicago, IL: Chicago O&#39;Hare International

- Dallas/Fort Worth, TX: Dallas/Fort Worth International

- Denver, CO: Denver International

- Detroit, MI: Detroit Metro Wayne County

- Fort Lauderdale, FL: Fort Lauderdale-Hollywood International

- Houston, TX: George Bush Intercontinental/Houston

- Las Vegas, NV: McCarran International

- Los Angeles, CA: Los Angeles International

All Other Airports

- Aberdeen, SD: Aberdeen Regional

- Abilene, TX: Abilene Regional

  解决方案:

  def extract_carriers(page):

data = []

with open(page, "r") as html:

soup = BeautifulSoup(html, &#39;lxml&#39;)

# find方法里为什么必须要用id定位:问题一

carrier_list=soup.find(id=&#39;CarrierList&#39;)

options=carrier_list.find_all(&#39;option&#39;)

for tag in options:

# 取出标签value所对应的值,添加到列表中。不要标签值中带有All的

if &#39;All&#39; not in tag[&#39;value&#39;]:

data.append(tag[&#39;value&#39;])

return data

  一问一答

  注意 find() 方法格式:find( name, attrs, recursive, text, **kwargs)。

  虽然名称标签也是唯一的,但是因为find函数已经使用了名称参数name来接收标签类型信息,下面两条语句其实是等价的:

  carrier_tag = soup.find(name=&#39;CarrierList&#39;)

carrier_tag = soup.find(&#39;CarrierList&#39;)

  相当于搜索了这种标签:,那么在目前的情况下肯定是搜索不到的~

  如果要使用 name 属性进行搜索,可以使用以下语法:

  carrier_list = soup.find(&#39;select&#39;, {&#39;name&#39;: &#39;CarrierList&#39;})

  练习:处理所有数据 练习:专利数据库

  在处理 XML 部分文件时,通常会遇到这样的错误:Error parsing XML: waste after document element。这是因为通常有效的 XML 文件只有一个主根节点,例如:

  如果出现 Error parsing XML: waste after document element 之类的错误,你的想法可能是只要主根有多个节点

  实际上,这种文件通常是由多个相互连接的 XML 文档组成的。一种解决方案是将文件拆分为多个文档,然后将这些文档处理为有效的 XML 文档。

  任务:根据分割,将不合格的XML文件分割成合格的XML文件。实现代码如下:

<p>def split_file(filename):

with open(filename) as infile:

n = -1 # 由于第一次遇到 &#39;

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线