Hướng dẫn beautifulsoup(html to markdown) - beautifulsoup (html để đánh dấu)

Tôi có thể biến đổi một số mã HTML thành Markdown trong Python bằng thư viện HTML2text và có vẻ như thế này:

def mark_down_formatting(html_text, url):
    h = html2text.HTML2Text()

    # Options to transform URL into absolute links
    h.body_width = 0
    h.protect_links = True
    h.wrap_links = False
    h.baseurl = url

    md_text = h.handle(html_text)

    return md_text

Và thật tuyệt trong một thời gian nhưng nó có giới hạn vì tôi không tìm thấy bất kỳ cách nào để tùy chỉnh đầu ra trên tài liệu.

Trên thực tế, tôi không cần nhiều tùy chỉnh, tôi chỉ cần thẻ HTML này

<div>
    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    <ul>
        <li>list item</li>
        <li>yet another list item</li>
    </ul>
</div>
<p>Some other text</p>
<ul>
    <li>list item</li>
    <li>yet another list item</li>
</ul>
5 để được chuyển đổi trong Markdown thành bất cứ điều gì tôi đưa ra. Nó có thể là
<div>
    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    <ul>
        <li>list item</li>
        <li>yet another list item</li>
    </ul>
</div>
<p>Some other text</p>
<ul>
    <li>list item</li>
    <li>yet another list item</li>
</ul>
6 này

Vì vậy, tôi đang tìm kiếm một giải pháp cho vấn đề của mình, vì HTML2Text là một thư viện tốt cho phép tôi định cấu hình một số tùy chọn, như những tùy chọn tôi đã hiển thị với các siêu liên kết, thật tuyệt khi có một giải pháp dựa trên thư viện này.

UPDATE:

Tôi có một giải pháp sử dụng thư viện đẹp nhưng tôi coi đó là một bản vá tạm thời vì nó thêm một sự phụ thuộc khác và nó thêm rất nhiều quá trình xử lý không cần thiết. Những gì tôi đã làm ở đây là chỉnh sửa HTML trước khi phân tích cú pháp vào Markdown:before parsing into markdown :

def processing_to_markdown(html_text, url, delimiter):
    # Not using "lxml" parser since I get to see a lot of different HTML
    # and the "lxml" parser tend to drop content when parsing very big HTML
    # that has some errors inside
    soup = BeautifulSoup(html_text, "html.parser")

    # Finds all <span class="searched_found">...</span> tags
    for tag in soup.findAll('span', class_="searched_found"):
        tag.string = delimiter + tag.string + delimiter
        tag.unwrap()  # Removes the tags to only keep the text

    html_text = unicode(soup)

    return mark_down_formatting(html_text, url)

Với nội dung HTML rất dài, điều này chứng tỏ khá chậm khi chúng tôi phân tích HTML hai lần, một lần với BeautifulSoup và sau đó với HTML2Text.

57

Nội dung chính ShowShow

  • Mô tả dự án
  • Cài đặt thế nào
  • Cách chạy bài kiểm tra đơn vị
  • Tài liệu
  • Tải tập tin
  • Phân phối nguồn
  • Phân phối xây dựng
  • Làm cách nào để chuyển đổi HTML thành văn bản trong Python?
  • Làm cách nào để lưu HTML dưới dạng văn bản đơn giản?
  • Làm cách nào để chuyển đổi HTML thành Markdown trong Python?
  • Làm cách nào để trích xuất tất cả văn bản từ một trang web trong Python?

Để trích xuất dữ liệu bằng cách sử dụng máy quét web với Python, bạn cần làm theo các bước cơ bản sau:..
Learn more.

Tìm URL mà bạn muốn cạo ..

<div>
    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    <ul>
        <li>list item</li>
        <li>yet another list item</li>
    </ul>
</div>
<p>Some other text</p>
<ul>
    <li>list item</li>
    <li>yet another list item</li>
</ul>

Tôi đã thử làm một cái gì đó như:

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)

... Nhưng theo cách đó, phần tử nhịp của tôi luôn ở trên một dòng mới. Đây tất nhiên là một ví dụ đơn giản. Có cách nào để có được văn bản trong trang HTML như cách nó sẽ được hiển thị trong trình duyệt (không cần quy tắc CSS, chỉ là cách thường xuyên div, span, li, v.v. Các yếu tố được hiển thị) trong Python không?

Đã hỏi ngày 12 tháng 11 năm 2012 lúc 2:06Nov 12, 2012 at 2:06Nov 12, 2012 at 2:06

1

Đẹp là một thư viện cào, vì vậy nó có thể không phải là lựa chọn tốt nhất để thực hiện kết xuất HTML. Nếu nó không cần thiết để sử dụng đẹp, bạn nên xem

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
1. Ví dụ:
import html2text
html = open("foobar.html").read()
print html2text.html2text(html)

Điều này ra:

Some text more text even more text

  * list item
  * yet another list item

Some other text

  * list item
  * yet another list item

Đã trả lời ngày 12 tháng 11 năm 2012 lúc 3:09Nov 12, 2012 at 3:09Nov 12, 2012 at 3:09

Deldeldeldel

6.09910 Huy hiệu vàng41 Huy hiệu bạc45 Huy hiệu đồng10 gold badges41 silver badges45 bronze badges10 gold badges41 silver badges45 bronze badges

5

Tôi đã gặp phải vấn đề tương tự khi cố gắng phân tích HTML được kết xuất. Về cơ bản, có vẻ như BS không phải là gói lý tưởng cho việc này. @Del cung cấp giải pháp HTML2Text tuyệt vời.

Trên một câu hỏi khác nhau: BeautifulSoup get_text không tước tất cả các thẻ và javascript @helge được đề cập bằng NLTK. Thật không may, NLTK dường như đang ngừng phương pháp này.

Tôi đã thử cả HTML2TEXT và NLTK.CLEAN_HTML và rất ngạc nhiên bởi kết quả thời gian vì vậy nghĩ rằng họ đã đảm bảo một câu trả lời cho hậu thế. Tất nhiên, tốc độ phụ thuộc rất nhiều vào nội dung của dữ liệu ...

Trả lời từ @Helge (NLTK).

import nltk

%timeit nltk.clean_html(html)
was returning 153 us per loop

Nó hoạt động thực sự tốt để trả lại một chuỗi với HTML được kết xuất. Mô -đun NLTK này nhanh hơn cả HTML2TEXT, mặc dù có lẽ HTML2TEXT mạnh hơn.

Câu trả lời ở trên từ @del

betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop

Đã trả lời ngày 5 tháng 11 năm 2013 lúc 17:53Nov 5, 2013 at 17:53Nov 5, 2013 at 17:53

PaulpaulPaulPaul

6.9478 Huy hiệu vàng39 Huy hiệu bạc40 Huy hiệu đồng8 gold badges39 silver badges40 bronze badges8 gold badges39 silver badges40 bronze badges

3

Mô tả dự án

HTML2TEXT là một tập lệnh Python chuyển đổi một trang HTML thành văn bản ASCII đơn giản, dễ đọc. Tốt hơn nữa, ASCII cũng là dấu hiệu hợp lệ (định dạng văn bản-to-HTML).

Sử dụng:

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
2
Quyền muaSự mô tả
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
3
Hiển thị số phiên bản và lối ra của chương trình
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
4,
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
5
Hiển thị thông báo trợ giúp này và thoát
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
6
Không bao gồm bất kỳ định dạng nào cho các liên kết
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
7
Thoát khỏi tất cả các nhân vật đặc biệt. Đầu ra là ít dễ đọc, nhưng tránh các vấn đề định dạng trường hợp góc.
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
8
Sử dụng các liên kết tham chiếu thay vì các liên kết để tạo Markdown
def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
9
Đánh dấu các khối được định dạng sẵn và mã với [mã] ... [/code]

Để biết danh sách đầy đủ các tùy chọn, hãy xem tài liệu

Hoặc bạn có thể sử dụng nó từ trong vòng

import html2text
html = open("foobar.html").read()
print html2text.html2text(html)
0:
def processing_to_markdown(html_text, url, delimiter):
    # Not using "lxml" parser since I get to see a lot of different HTML
    # and the "lxml" parser tend to drop content when parsing very big HTML
    # that has some errors inside
    soup = BeautifulSoup(html_text, "html.parser")

    # Finds all <span class="searched_found">...</span> tags
    for tag in soup.findAll('span', class_="searched_found"):
        tag.string = delimiter + tag.string + delimiter
        tag.unwrap()  # Removes the tags to only keep the text

    html_text = unicode(soup)

    return mark_down_formatting(html_text, url)
8

Hoặc với một số tùy chọn cấu hình:

def processing_to_markdown(html_text, url, delimiter):
    # Not using "lxml" parser since I get to see a lot of different HTML
    # and the "lxml" parser tend to drop content when parsing very big HTML
    # that has some errors inside
    soup = BeautifulSoup(html_text, "html.parser")

    # Finds all <span class="searched_found">...</span> tags
    for tag in soup.findAll('span', class_="searched_found"):
        tag.string = delimiter + tag.string + delimiter
        tag.unwrap()  # Removes the tags to only keep the text

    html_text = unicode(soup)

    return mark_down_formatting(html_text, url)
9

Ban đầu được viết bởi Aaron Swartz. Mã này được phân phối theo GPLV3.

Cài đặt thế nào

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
1 có sẵn trên pypi https://pypi.org/project/html2text/
<div>
    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    <ul>
        <li>list item</li>
        <li>yet another list item</li>
    </ul>
</div>
<p>Some other text</p>
<ul>
    <li>list item</li>
    <li>yet another list item</li>
</ul>
1

Cách chạy bài kiểm tra đơn vị

<div>
    <p>
        Some text
        <span>more text</span>
        even more text
    </p>
    <ul>
        <li>list item</li>
        <li>yet another list item</li>
    </ul>
</div>
<p>Some other text</p>
<ul>
    <li>list item</li>
    <li>yet another list item</li>
</ul>
2

Để xem kết quả bảo hiểm:

def parse_text(contents_string)
    Newlines = re.compile(r'[\r\n]\s+')
    bs = BeautifulSoup.BeautifulSoup(contents_string, convertEntities=BeautifulSoup.BeautifulSoup.HTML_ENTITIES)
    txt = bs.getText('\n')
    return Newlines.sub('\n', txt)
0

Sau đó mở tệp

import html2text
html = open("foobar.html").read()
print html2text.html2text(html)
2 trong trình duyệt của bạn.

Tài liệu

Tài liệu sống ở đây

Tải tập tin

Tải xuống tệp cho nền tảng của bạn. Nếu bạn không chắc chắn nên chọn cái nào, hãy tìm hiểu thêm về việc cài đặt các gói.

Phân phối nguồn

Phân phối xây dựng

Làm cách nào để chuyển đổi HTML thành văn bản trong Python?

Điều này có thể đạt được với sự trợ giúp của phương thức html.escape () (đối với Python 3.4+), chúng ta có thể chuyển đổi chuỗi ASCII thành tập lệnh HTML bằng cách thay thế các ký tự ASCII bằng các ký tự đặc biệt bằng cách sử dụng HTML. Phương thức thoát (). Bằng phương pháp này, chúng ta có thể giải mã các thực thể HTML thành văn bản.html.escape() method(for Python 3.4+), we can convert the ASCII string into HTML script by replacing ASCII characters with special characters by using html. escape() method. By this method we can decode the HTML entities into text.html. escape() method(for Python 3.4+), we can convert the ASCII string into HTML script by replacing ASCII characters with special characters by using html. escape() method. By this method we can decode the HTML entities into text.

Làm cách nào để lưu HTML dưới dạng văn bản đơn giản?

Lưu trang web HTML dưới dạng tài liệu văn bản (mất mã HTML) ....

Nhấp lại tab Tệp, sau đó nhấp vào tùy chọn Lưu dưới dạng ..

Trong danh sách lưu xuống dưới dạng loại, chọn tùy chọn văn bản đơn giản (*. TXT).....

Nhấp vào nút Lưu để lưu dưới dạng tài liệu văn bản ..

Làm cách nào để chuyển đổi HTML thành Markdown trong Python?

Phương pháp này rất hữu ích nếu bạn chuyển đổi số lượng lớn một loạt các tệp HTML thành Markdown - chỉ lặp qua danh sách các tệp HTML và lưu chúng vào các tệp đánh dấu.Từ Markdownify Nhập Markdoify File = Open ("./ Hello-world. HTML", "R").đọc () html = markdownify (file, heading_style = "atx") in (html) ## ## Xin chào, thế giới!iterate over a list of HTML files and save them to Markdown files. from markdownify import markdownify file = open("./hello-world. html", "r"). read() html = markdownify(file, heading_style="ATX") print(html) ## ## Hello, World!iterate over a list of HTML files and save them to Markdown files. from markdownify import markdownify file = open("./hello-world. html", "r"). read() html = markdownify(file, heading_style="ATX") print(html) ## ## Hello, World!

Làm cách nào để trích xuất tất cả văn bản từ một trang web trong Python?

Để trích xuất dữ liệu bằng cách sử dụng máy quét web với Python, bạn cần làm theo các bước cơ bản sau:...

Tìm URL mà bạn muốn cạo ..

Kiểm tra trang ..

Tìm dữ liệu bạn muốn trích xuất ..

Viết mã ..

Chạy mã và trích xuất dữ liệu ..

Lưu trữ dữ liệu theo định dạng cần thiết ..