この 3 つのテキストと 1 つの正規表現があります。(わかりました、HTML ですが、...どうか、それに注目しないでください !!!!)
<h3 class="pubAdTitleBlock "><a href="/it/pubblicazioni/libri/Che-speranza-cè-per-i-morti/1101987030/" title="Che speranza c’è per i morti?">Che speranza c’è per i morti? (volantino N. 16)</a></h3>
<h3 class="pubAdTitleBlock "><a href="/it/pubblicazioni/libri/cosa-insegna-la-bibbia/È-questo-che-Dio-voleva/" title="È questo che Dio voleva?">Cosa insegna realmente la Bibbia?</a></h3>
<h3 class="pubAdTitleBlock">Cantiamo a Geova</h3>
これは正規表現です
regexp = "<h3[^>]*>(<a[^>]*>)?([^<]+)(</a>)?</h3>";
私は3つの3つのグループを持っています:
- 開始
<a>
タグ (オプション) - テキスト (本のタイトルであり、 regexp の目標です)
- 終了
</a>
タグ (オプション)
問題: 2 行目が一致し、3 行目が一致します。最初の番号。なんで ?
一致するコード:
pattern = Pattern.compile(regexp);
matcher = pattern.matcher(fullString);
idx = 0;
while (matcher.find()) {
...
}
matcher.find()
単純に最初の行をスキップします。これはファイルの最初の行ではなく、10 行目です。最初の例です。
リテラル括弧が問題になる可能性はありますか? 正規表現を修正するには?
編集:試してみました
String regexp = "<h3[^>]*>(.+)</h3>";
しかし、この正規表現も最初の行をスキップします...私は本当に理解できません!!!!
編集2:
私は疑問を持っています: アクセント付きの文字がある場合、問題になる可能性がありますか?
編集3:
ここからデータスクレイピングを試みています: http://www.jw.org/it/pubblicazioni/libri/?contentLanguageFilter=it&sortBy=3
入力ストリームがあり、次のコードを使用して単一の文字列に変換します。
// copied from http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string
public static String convertStreamToString(InputStream is) {
try {
return new java.util.Scanner(is, "UTF-8").useDelimiter("\\A").next();
} catch (java.util.NoSuchElementException e) {
return "";
}
次に、正規表現を適用しています...