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 遍历每个元素并打印出该元素中的每个文本,包括每个子节点中存在的文本。然后它转到子节点并打印出剩余的文本,依此类推。

我看到很多人通过 cssQuery 指定 Tag/Attributes 来绕过这个问题,但我的项目需要对任何可抓取的网站执行此操作。

如有任何建议,我们将不胜感激。

您的假设是正确的 - 但 BeautifulSoup 可能也会这样做。只有 findAll(text=True) 中的 text=True 将结果限制为纯文本节点。要在 JSoup 中具有等效项,请使用以下选择器:

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