簡體   English   中英

Jsoup-將html文本轉換為字符串列表

[英]Jsoup - Convert html texts into a list of Strings

使用Jsoup,我希望能夠將每個html標記中存在的文本依次添加到List<String>中。

這在python中使用BeautifulSoup4相當容易,但是我在Java中卻很難。

BeautifulSoup代碼:

from bs4 import BeautifulSoup
from bs4.element import Comment
import urllib.request


def tag_visible(element):
    if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
    return False
    if isinstance(element, Comment):
        return False
    return True


def text_from_html(body):
    soup = BeautifulSoup(body, 'html.parser')
    texts = soup.findAll(text=True)
    visible_texts = filter(tag_visible, texts)

    text_list =[]

    for t in visible_texts:
        text_list.append(t.strip())

    return list(filter(None, text_list))

html = urllib.request.urlopen('https://someURL.com/something').read()
print(text_from_html(html))

此代碼將打印["text1", "text2", "text3",...]


我最初的嘗試是遵循Jsoup文檔進行文本轉換。

Jsoup代碼嘗試1:

Document doc = Jsoup.connect('https://someURL.com/something')
                        .userAgent("Bot")
                        .get();
Elements divElements = doc.select("*")
List<String> texts = divElements.eachText();
System.out.println(texts);

最終發生的是文本的重復["text1 text2 text3","text2 text3", "text3",...]

我的假設是Jsoup遍歷每個Element並打印出Element內的每個文本,包括每個子節點中存在的文本。 然后,它轉到子節點並打印出剩余的文本,依此類推。

我已經看到很多人通過cssQuery指定標簽/屬性來繞過此問題,但是我的項目要求對任何可抓取的網站執行此操作。

任何建議表示贊賞。

您的假設是正確的-但BeautifulSoup可能也會這樣做。 findAll(text=True)只有text=True將結果限制為純文本節點。 要在JSoup中具有等效功能,請使用以下選擇器:

Elements divElements = doc.select(":matchText");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM