>백엔드 개발 >파이썬 튜토리얼 >Python 크롤러로 HTML 페이지를 구문 분석하는 방법

Python 크롤러로 HTML 페이지를 구문 분석하는 방법

WBOY
WBOY앞으로
2023-05-30 21:41:422983검색

Python으로 HTML 페이지 구문 분석

우리는 일반적으로 필요한 데이터를 얻기 위해 웹 크롤링 페이지를 구문 분석해야 합니다. HTML 태그의 결합 구조를 분석하여 웹 페이지에 포함된 유용한 정보를 추출할 수 있습니다. Python에는 HTML을 구문 분석하는 세 가지 일반적인 방법이 있습니다: 정규식 구문 분석, XPath 구문 분석 및 CSS 선택기 구문 분석.

HTML 페이지의 구조

HTML 파싱 방법을 설명하기 전에 HTML 페이지의 기본 구조를 이해하는 것이 전제입니다. 브라우저에서 웹 사이트를 열고 마우스 오른쪽 버튼 클릭 메뉴를 통해 "웹 페이지 소스 코드 표시" 메뉴 항목을 선택하면 해당 웹 페이지에 해당하는 HTML 코드를 볼 수 있습니다. HTML 코드는 일반적으로 태그, 속성 및 텍스트로 구성됩니다. 레이블은 페이지에 표시되는 콘텐츠를 전달하고, 속성은 레이블 정보를 보완하며, 텍스트는 레이블이 표시하는 콘텐츠입니다. 다음은 간단한 HTML 페이지 코드 구조의 예입니다.

<!DOCTYPE html>
<html>
    <head>
        <!-- head 标签中的内容不会在浏览器窗口中显示 -->
        <title>这是页面标题</title>
    </head>
    <body>
        <!-- body 标签中的内容会在浏览器窗口中显示 -->
        <h2>这是一级标题</h2>
        <p>这是一段文本</p>
    </body>
</html>

이 HTML 페이지 코드 예에서 8b05045a5be5764f313ed5b9168a17e6是文档类型声明,100db36a723c770d327fc0aef2ce13b1标签是整个页面的根标签,93f0f5c25f18dab9d176bd4f6de5d30e6c04bd5ca3fcae76e30b72ad730ca86d100db36a723c770d327fc0aef2ce13b1标签的子标签,放在6c04bd5ca3fcae76e30b72ad730ca86d标签下的内容会显示在浏览器窗口中,这部分内容是网页的主体;放在93f0f5c25f18dab9d176bd4f6de5d30e 태그 아래의 콘텐츠는 브라우저 창에 표시되지 않지만 일반적으로 The라고 불리는 페이지의 중요한 메타 정보가 포함되어 있습니다. 웹페이지 헤더. HTML 페이지의 일반적인 코드 구조는 다음과 같습니다.

<!DOCTYPE html>
<html>
    <head>
        <!-- 页面的元信息,如字符编码、标题、关键字、媒体查询等 -->
    </head>
    <body>
        <!-- 页面的主体,显示在浏览器窗口中的内容 -->
    </body>
</html>

태그, CSS(Cascading Style Sheets) 및 JavaScript는 HTML 페이지를 구성하는 세 가지 기본 구성 요소입니다. 태그는 페이지에 표시할 콘텐츠를 전달하는 데 사용되고, CSS는 페이지 렌더링을 담당하며, JavaScript는 페이지의 대화형 동작을 제어하는 ​​데 사용됩니다. HTML 페이지를 구문 분석하려면 원래 XML의 쿼리 구문인 XPath 구문을 사용할 수 있습니다. 또한 HTML 태그의 계층 구조를 기반으로 태그의 콘텐츠나 태그 속성을 추출할 수 있습니다. 또한 CSS 선택기를 사용하여 페이지를 찾을 수도 있습니다. . 요소는 CSS를 사용하여 페이지 요소를 렌더링하는 것과 동일합니다.

XPath 구문 분석

XPath는 XML(eXtensible Markup Language) 문서에서 정보를 찾는 구문입니다. XML은 HTML과 유사하며 태그를 사용하여 데이터를 전달하는 태그 언어입니다. 사용자 정의할 수 있으며 XML에는 더 엄격한 구문 요구 사항이 있습니다. XPath는 경로 표현식을 사용하여 XML 문서에서 노드 또는 노드 세트를 선택합니다. 여기에 언급된 노드에는 요소, 속성, 텍스트, 네임스페이스, 처리 지침, 주석, 루트 노드 등이 포함됩니다.

XPath 경로 표현은 파일 경로 구문과 유사하며 "/" 및 "//"를 사용하여 노드를 선택할 수 있습니다. 루트 노드를 선택할 때 단일 슬래시 "/"를 사용할 수 있으며, 임의의 위치에서 노드를 선택할 때 이중 슬래시 "//"를 사용할 수 있습니다. 예를 들어, "/bookstore/book"은 루트 노드 bookstore 아래의 모든 book 하위 노드를 선택하는 것을 의미하고 "//title"은 임의의 위치에서 제목 노드를 선택하는 것을 의미합니다.

XPath는 조건자를 사용하여 노드를 필터링할 수도 있습니다. 대괄호 안의 중첩 표현식은 숫자, 비교 연산자 또는 조건자 역할을 하는 함수 호출일 수 있습니다. 예를 들어, "/bookstore/book[1]"은 bookstore의 첫 번째 자식 노드 book을 선택한다는 의미이고, "//book[@lang]"은 lang 속성을 가진 모든 book 노드를 선택한다는 의미이다.

XPath 함수에는 문자열, 수학, 논리, 노드, 시퀀스 및 기타 함수가 포함됩니다. 이러한 함수는 노드 선택, 값 계산, 데이터 유형 변환 및 기타 작업에 사용할 수 있습니다. 예를 들어, "string-length(string)" 함수는 문자열의 길이를 반환할 수 있고, "count(node-set)" 함수는 노드 집합의 노드 수를 반환할 수 있습니다.

아래에서는 XPath를 사용하여 페이지를 구문 분석하는 방법을 설명하기 위해 예를 사용합니다. 다음 XML 파일이 있다고 가정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="zh">Learning XML</title>
      <price>39.95</price>
    </book>
</bookstore>

이 XML 파일의 경우 아래와 같이 XPath 구문을 사용하여 문서의 노드를 가져올 수 있습니다.

경로 표현 result
/bookstore 루트 요소 bookstore를 선택하세요. 참고: 경로가 슬래시( / )로 시작하는 경우 이 경로는 항상 요소에 대한 절대 경로를 나타냅니다!
//book 문서에서의 위치에 관계없이 모든 book 하위 요소를 선택합니다.
//@lang lang이라는 이름의 모든 속성을 선택하세요.
/bookstore/book[1] 서점의 첫 번째 자식 노드 도서를 선택하세요.

CSS 选择器解析

通过HTML标签的属性和关系来定位元素的方式被称为CSS选择器。根据 HTML 标签的层级结构、类名、id 等属性能够确定元素的位置。在 Python 中,我们可以使用 BeautifulSoup 库来进行 CSS 选择器解析。

我们接下来会举一个例子,讲解如何运用 CSS 选择器来分析页面。假设我们有如下的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>

我们可以使用如下所示的 CSS 选择器语法来选取页面元素。

选择器 结果
div.content 选取 class 为 content 的 div 元素。
h2 选取所有的 h2 元素。
div.footer p 选取 class 为 footer 的 div 元素下的所有 p 元素。
[href] 选取所有具有 href 属性的元素。

正则表达式解析

用正则表达式可以解析 HTML 页面,从而实现文本的匹配、查找和替换。使用 re 模块可以进行 Python 的正则表达式解析。

下面我们通过一个例子来说明如何使用正则表达式对页面进行解析。假设我们有如下的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>

我们可以使用如下所示的正则表达式来选取页面元素。

import re
html = '''
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>
'''
pattern = re.compile(r'
.*?

(.*?)

.*?

(.*?)

.*?
', re.S) match = re.search(pattern, html) if match: title = match.group(1) text = match.group(2) print(title) print(text)

以上代码中,我们使用 re 模块的 compile 方法来编译正则表达式,然后使用 search 方法来匹配 HTML 代码。在正则表达式中,“.*?”表示非贪婪匹配,也就是匹配到第一个符合条件的标签就停止匹配,而“re.S”表示让“.”可以匹配包括换行符在内的任意字符。最后,我们使用 group 方法来获取匹配的结果。

위 내용은 Python 크롤러로 HTML 페이지를 구문 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제