Hướng dẫn how do you select html element in python? - làm thế nào để bạn chọn phần tử html trong python?

Đây là một phần của mã của tôi, làm thế nào tôi có thể chọn '3 được bán' giữa thẻ A ở phía dưới. Sử dụng súp đẹp.


9 available / 3 sold

Hỏi ngày 25 tháng 10 năm 2017 lúc 17:05Oct 25, 2017 at 17:05

3 \nsold >>>

Đã trả lời ngày 25 tháng 10 năm 2017 lúc 17:34Oct 25, 2017 at 17:34

Don Charliedon CharlieDon Charlie

4133 Huy hiệu bạc11 Huy hiệu đồng3 silver badges11 bronze badges

Trong bài viết này, chúng ta sẽ thấy cách trích xuất thông tin có cấu trúc từ các trang web tận dụng các bộ chọn CSS đẹp và CSS.

Nhận HTML

BeautifulSoup không phải là một thư viện quét web mỗi se. Đó là một thư viện cho phép bạn hiệu quả và dễ dàng rút ra thông tin từ HTML. Trong thế giới thực, nó thường được sử dụng cho các dự án cạo web.

Vì vậy, để bắt đầu, chúng tôi cần một tài liệu HTML. Với mục đích đó, chúng tôi sẽ sử dụng gói yêu cầu của Python và lấy trang chính của HackerNews.

import requests
response = requests.get["//news.ycombinator.com/"]
if response.status_code != 200:
	print["Error fetching page"]
	exit[]
else:
	content = response.content
print[content]

> b' content="width=device-width, initial-scale=1.0"> a[href*=ebay]"].get_text[]
5 đơn giản. Trong phần còn lại của bài viết này, chúng tôi sẽ gọi BeautifulSoup4 là "BS4".

Bây giờ chúng ta cần phải phân tích HTML và tải nó vào cấu trúc BS4.

from bs4 import BeautifulSoup
soup = BeautifulSoup[response.content, 'html.parser']

Đối tượng

soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
6 này rất tiện dụng và cho phép chúng tôi dễ dàng truy cập nhiều thông tin hữu ích như:

# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...

Nhắm mục tiêu các yếu tố DOM

Bạn có thể bắt đầu thấy một mẫu trong cách sử dụng thư viện này. Nó cho phép bạn nhắm mục tiêu nhanh chóng và thanh lịch các yếu tố DOM bạn cần.

Nếu bạn cần chọn các thành phần DOM từ thẻ của nó [

soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
7,
soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
8,
soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
9, ....] Bạn chỉ có thể làm
>>> soup = BeautifulSoup[text, 'html.parser']
>>> span = soup.findAll['a'][0].next
>>> span
u'3 \nsold'
>>> soup.findAll['a'][0]
3 \nsold
>>>
0 để chọn nó. Tiền báo là nó sẽ chỉ chọn phần tử HTML đầu tiên với thẻ đó.

Ví dụ: nếu tôi muốn liên kết đầu tiên, tôi chỉ cần truy cập vào trường

soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
3 của đối tượng BeautifulSoup của tôi

 first_link = soup.a
 print[first_link]
 >

Yếu tố đó là một đại diện đầy đủ của thẻ đó và đi kèm với khá nhiều phương pháp cụ thể HTML

# The text of the link
print[first_link.text]
# Empty because first link only contains an 

Điều tuyệt vời là nó cũng hoạt động theo cách khác. Nhấp chuột phải vào bất kỳ yếu tố nào trong trình kiểm tra DOM và chọn

from bs4 import BeautifulSoup
soup = BeautifulSoup[response.content, 'html.parser']
7 -
from bs4 import BeautifulSoup
soup = BeautifulSoup[response.content, 'html.parser']
8 từ menu ngữ cảnh.

Voilà, bạn có bộ chọn phù hợp trong bảng tạm của bạn.


Biểu cảm nâng cao

Bộ chọn CSS cung cấp một cú pháp toàn diện để chọn các phần tử trong nhiều cài đặt khác nhau.

Điều này bao gồm các bộ kết hợp trẻ em và con cháu, bộ chọn thuộc tính, và nhiều hơn nữa.

Trẻ em và con cháu

Bộ chọn Trẻ em và Hậu duệ cho phép bạn chọn các yếu tố là con ngay lập tức hoặc gián tiếp của một yếu tố cha mẹ nhất định.

soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
5

Và bạn có thể trộn chúng lại với nhau:

soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
6

Bộ chọn đó sẽ hoạt động hoàn toàn tốt với đoạn trích HTML này.

soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
7

Anh chị em ruột

Đây là một trong những mục yêu thích của tôi bởi vì nó cho phép bạn chọn các yếu tố dựa trên các yếu tố ở cùng cấp độ trong hệ thống phân cấp Dom, do đó biểu thức anh chị em.

soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
8

Để chọn tất cả

from bs4 import BeautifulSoup
soup = BeautifulSoup[response.content, 'html.parser']
9 sắp tới sau
# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...
0, bạn có thể sử dụng bộ chọn
# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...
1 [nó sẽ khớp với hai
soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
7].

Bạn cũng có thể sử dụng

# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...
3 nếu bạn chỉ muốn chọn
soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
7 ngay sau
# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...
5 của chúng tôi [nó sẽ chỉ khớp với một
soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
7].

Bộ chọn thuộc tính

Bộ chọn thuộc tính cho phép bạn chọn các thành phần với các giá trị thuộc tính cụ thể. Vì vậy,

# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...
7 sẽ phù hợp

Pseudo-classes

Giả sử chúng ta có tài liệu HTML này.

soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
9

Hơn nữa, giả sử chúng tôi chỉ muốn chọn một yếu tố ____27 cụ thể. Chào mừng bạn đến với các lớp giả!Welcome to pseudo-classes!

Các lớp giả, chẳng hạn như

# The title tag of the page
print[soup.title]
> Hacker News

# The title of the page as string
print[soup.title.string]
> Hacker News

# All links in the page
nb_links = len[soup.find_all['a']]
print[f"There are {nb_links} links in this page"]
> There are 231 links in this page

# Text from the page
print[soup.get_text[]]
> Hacker News
> Hacker News
> new | past | comments | ask | show | jobs | submit
> login
> ...
9,
 first_link = soup.a
 print[first_link]
 >
0 và
 first_link = soup.a
 print[first_link]
 >
1, ví dụ cho phép bạn chọn các phần tử cụ thể theo vị trí của chúng trong cây Dom.

soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
0

Có rất nhiều lớp giả khác [ví dụ:

 first_link = soup.a
 print[first_link]
 >
2 sẽ chọn tất cả các hộp kiểm đã kiểm tra] và bạn có thể tìm thấy một danh sách đầy đủ ở đây. Nếu bạn thích tìm hiểu thêm về các bộ chọn CSS, bạn cũng có thể thấy bài viết này thú vị.

Mã duy trì

Tôi cũng nghĩ rằng các biểu thức CSS dễ bảo trì hơn. Ví dụ: tại ScrapingBee, khi chúng tôi thực hiện các tác vụ quét web tùy chỉnh, tất cả các tập lệnh của chúng tôi bắt đầu như thế này:

soup.select_one[".qtyTxt .vi-qtyS > a[href*=ebay]"].get_text[]
1

Điều này giúp dễ dàng sửa các tập lệnh khi các thay đổi đối với DOM được thực hiện.

Chắc chắn, một cách khá dễ dàng để xác định bộ chọn CSS phù hợp là chỉ cần sao chép/dán những gì Chrome đã cho bạn khi bạn nhấp chuột phải vào một yếu tố. Tuy nhiên, bạn nên cẩn thận, vì các đường dẫn chọn này có xu hướng rất "tuyệt đối" trong tự nhiên và thường không hiệu quả nhất cũng không rất kiên cường để thay đổi DOM. Nói chung, tốt nhất là xác minh các bộ chọn như vậy theo cách thủ công trước khi bạn sử dụng chúng trong tập lệnh của mình.

Chúng tôi đã phát hành một tính năng mới giúp toàn bộ quá trình này đơn giản hơn. Bây giờ bạn có thể trích xuất dữ liệu từ HTML với một cuộc gọi API đơn giản. Hãy kiểm tra các tài liệu. Nếu bạn thích thử ScrapingBee, chúng tôi rất vui khi cung cấp 1.000 cuộc gọi API đầu tiên miễn phí.first 1,000 API calls for free.

Sự kết luận

Bộ chọn đẹp và CSS cung cấp một cách tiếp cận rất thanh lịch và trọng lượng nhẹ để điều hành các công việc quét web của bạn từ một kịch bản Python. Cụ thể, các bộ chọn CSS là một công nghệ cũng được sử dụng ngoài vương quốc của Python và một cái gì đó chắc chắn đáng để thêm vào danh sách các công cụ của một người.

Tôi hy vọng bạn thích bài viết này về việc quét web trong Python và nó sẽ làm cho cuộc sống của bạn dễ dàng hơn. Nếu bạn thích đọc thêm về việc quét web trong Python, đừng ngần ngại kiểm tra hướng dẫn quét web Python rộng rãi của chúng tôi. Bạn cũng có thể được quan tâm bởi hướng dẫn XPath của chúng tôi.

Hạnh phúc cào,

Pierre de Wulf

Bài Viết Liên Quan

Chủ Đề