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");
使用 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");