Đâ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[]
5Và bạn có thể trộn chúng lại với nhau:
soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
6Bộ 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[]
7Anh 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ợpPseudo-classes
Giả sử chúng ta có tài liệu HTML này.
soup.select_one[".qtyTxt .vi-qtyS > a"].get_text[]
9Hơ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[]
0Có 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
Chủ Đề